🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

1636閲覧

Unity2DにてC#を使い複数の巨大なサイズのcsvファイルを軽快に使用したい

MujinSekai

総合スコア18

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2021/01/09 00:07

編集2021/01/10 06:14

ファイルによって異なりますが、大体10MB程度のファイルが複数あり、順番に読み込んだ後、ゲーム内で同時に使用したいと思っているのですが、ファイルサイズが大きすぎて半分フリーズしたような状態になります。しばらく待てば操作可能になるのですが、このままだと到底ゲームでは使えないように思えます。

そこで、ファイルの容量を減らしたいのですが、ファイルを圧縮した場合、
(1)圧縮したファイルの中身のcsvファイルの数値を読み取れるのか?
(2)C#で上記は可能なのか?
(3)他の言語(例えばPython)なら可能なのか?
(4)軽快にcsvファイルを使用する他の方法があるのか?

検索してみた所、Pythonなら可能であるようにも見受けられましたが、なにぶんPythonはほとんど触った事がないため確証を得られませんでした。

ご教示、お願いいたします。

Unity2019.4.17f1

──(1月10日追記)──

現在、ファイルをバイナリ化する事、文字列に戻す事、そしてファイルに書き込む事を試しております。

ファイルをバイナリ化する事と文字列に直す事は、
こちら
を参考にさせて頂いております。

また、ファイルに書き込む事は
こちら
を参考にさせて頂きました。

元のcsvファイルをバイナリ化し、ファイルに書き込む事は成功? したように思うのですが(バイナリエディタで中身を見ても正直さっぱり……です)、文字列に直すと明らかに元のファイには戻っていない現状です。バイナリ化が上手いっていないのか、文字列に戻すのが悪いのか、これから検証しようと思います。

元のcsvファイルとバイナリ化したファイルを置いておきますので、よかったら見てやって下さい。

CSV_TEST

パスワード:1010

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2021/01/09 01:22

予め読み込んでおいて使用するのはダメなのですか? またどのように処理を行っているのか分からないので、どう処理すべきか提案出来ないと思います。
fumu7

2021/01/09 01:27

全てのファイルを読み込んでも十分に余裕があるサイズのメモリがありますか? データがメモリに入りきらないと仮想メモリのためのディスクとメモリ間の頻繁なデータ転送(スラッシング)が発生して動作が遅くなります。 圧縮されたデータは、メモリ上に展開しないと本来の値を得る事が出来ません。圧縮してファイルサイズが小さくなって読み込みが早くなるのと、ファイルの展開をする処理時間がかかるようになるのと、どちらの影響が大きいのかを確認して判断すべきかと思います。
MujinSekai

2021/01/09 02:12

YAmaGNZさん、回答ありがとうございます。 fumu7さん、回答ありがとうございます。 本心を言いますとゲーム開始前に全てのファイルを予め読み込んでおいて使用したいと思っております。ただ使用するcsvファイルですが、合計で4GBあり、これから大きく増える事はないと想定していますが、ここから減ることもないので何とか容量を小さくしたいと考えておりました。zipで圧縮すると三分の一になったので、これならば、と思いました。また時間の経過と共に全てのファイルのそれぞれの数値によって挙動を変える予定でした。しかし結局の所メモリ上に展開しないと本来の値を得る事が出来ないとの事で、正直このデータを使うのを諦めかけています。ご教示、ありがとうございます。
Zuishin

2021/01/09 02:51 編集

一度に読み込むのではなく、分割して必要になったときに適宜読み込む方法がとれるならそのようにしたらどうでしょうか。 何のデータをどのようにして使っているのかがわからなければ最適な方法を考えることはできません。また、どのように読み込んでいるかがわからなければ読み込み方法の改良もできません。また Unity で Python は使えません。
YAmaGNZ

2021/01/10 10:12

CSVだろうがバイナリファイルだろうが関係ないでしょうね。 データの利用の仕方次第でどのように読み込むのが最適なのか変わるでしょうし、DBを利用したほうがいい可能性もありますし。
guest

回答2

0

自己解決

色々試してみた結果、取り敢えず分割したcsvファイルをテキストとしてを読み込んで使用する事に致しました。
回答して下さった方、ご覧になって下さった方、ありがとうございました。

投稿2021/01/15 09:35

MujinSekai

総合スコア18

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

MujinSekai さんが説明くださった目的について
説明しやすいように番号を振らせていただきました。

  1. ゲーム開始時に全てのファイルを読み込む。
  2. その際、進捗のアニメーションを入れたい。
  3. 全ファイルの数値から処理を行う。
  4. 一度全ファイルを解放。
  5. 以後、必要になったら必要なファイルを読み込む。

「4.、5.」 のような処理が入るのでしたら、
「3.」 までの処理を行う単体のツールを作って、
その結果をファイルとして別途出力して、
ゲーム開始時にはそのファイルを読むようにすれば、
起動時間をかなり短縮できるのではないでしょうか?

「2.」の処理については、ファイルを切れ目なく読み込まず、
適切な単位(適切なファイル数ないし行数)で短い sleep() などを入れて UI に処理を戻すようにすれば、
(例えばそこで進捗のアニメーションを表示したり、キャンセルボタンなどを検知する処理を入れれば)
よいと思います。
Unity についてはあまりよくわからないのですが、おそらくマルチスレッド化などしていても、
ファイル読み込みを切れ目なく行ってしまうと、アニメーション処理などは止まってしまうと思われます。

データのバイナリ化については、独自のファイル形式を作る方法と、C#の シリアライズ化を使って、
バイナリシリアライズする方法があると思います。
どちらがより適切かは私にもよくわかりませんが。

投稿2021/01/09 04:55

編集2021/01/09 07:04
kozuchi

総合スコア1193

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MujinSekai

2021/01/09 05:59

・一つのファイルは数千行、数千列でそれぞれ0〜5000の数値が記載されているcsv ・バイナリ化はどうやって行うかがわからないので調べてみます ・本当は一つのファイルとして扱いたい ゲーム開始時に全てのファイルを読み込む。 その際、進捗のアニメーションを入れたい。 全ファイルの数値から処理を行う。 一度全ファイルを解放。 以後、必要になったら必要なファイルを読み込む。 現状、自分のやりたい事は上記になります。 ・UnityでPythonを使う →甚だしい勘違いでした。失礼いたしました。 ・全てのファイルを読み込んでテストを行なったのは随分前なので、これから再度テストを行なってみます(なぜか以前は数値からメッシュを作成していました。その方が軽いと考えたんだと思います)
kozuchi

2021/01/09 06:41

コメントありがとうございます。回答の内容を更新しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問