大規模なCSV形式のファイル(通常は200-600mb)をJavaで(効率的にメモリにアクセスし、できるだけ高速に)ロードしようとしています。現在、プログラムは文字列配列のリストを利用しています。この操作は以前は、各CSV行のテーブルと各「行」テーブルを保持するテーブルを使用するLuaプログラムで処理されていました。Java - 大量のString配列を効率的に格納する方法
以下は、メモリの違いやロード時間の一例である:
- CSVファイル - 232メガバイト
- のLua - メモリ内の549メガバイト -
- のJavaをロードするために157秒 - メモリ内の1378メガバイト - 12秒をロードする
正しく覚えていれば、実際の値への参照として、Luaテーブルの重複した項目が存在します。私は、Javaの例では、リストには各重複値の別々のコピーが保持されており、それはより大きなメモリ使用量に関連している可能性があると考えられます。以下
は、CSVファイル内のデータ上でいくつかの背景である。各列内- 3とすることができます「赤」、「緑」、または「青」)。
- コンテンツ内に個の重複文字列があります。があります。以下は
- 検索テーブル(フィールドからソート可能)。
- 文字列を変更または置き換えます。
私の質問 - データを保持するのに必要なメモリは少なくても、データを簡単かつ迅速に検索/並べ替える機能はありますか?
あなたは、列3は、わずか数の可能な値を保持していることがわかっている場合、あなたは[インターンそれら](http://docs.oracleできました.com/javase/7/docs/api/java/lang/String.html#intern%28%29)を使用して、メモリ使用量を減らします。参考:http://stackoverflow.com/a/1855195/829571 – assylias
ありがとうassylias私はそれを使用していくつかのテストを実行します。短い文字列には効率的かどうかは分かりますか? "To"または "Go"。ほとんどのフィールドには45文字+の文字列が含まれていますが、かなり短い文字列(4文字以下)もあります。 – user1816198
http://stackoverflow.com/questions/12792942/alternatives-to-java-string-interningをご覧ください。 –