大きな CSV 形式のファイル (通常は 200 ~ 600 MB) を Java で効率的に読み込もうとしています (メモリが少なく、アクセスが可能な限り高速です)。現在、プログラムは文字列配列のリストを利用しています。この操作は以前、各 CSV 行のテーブルと各「行」テーブルを保持するテーブルを使用する Lua プログラムで処理されていました。
以下は、メモリの違いとロード時間の例です。
- CSV ファイル - 232MB
- Lua - メモリ内 549MB - 読み込みに 157 秒
- Java - 1,378MB のメモリ - 読み込みに 12 秒
私の記憶が正しければ、Lua テーブル内の重複項目は実際の値への参照として存在します。Java の例では、List が各重複値の個別のコピーを保持しており、それがより大きなメモリ使用量に関連している可能性があると思われます。
以下は、CSV ファイル内のデータの背景です。
- 各フィールドは String で構成されます
- 各行内の特定のフィールドには、文字列のセットの 1 つが含まれる場合があります (たとえば、フィールド 3 は「赤」、「緑」、または「青」である可能性があります)。
- コンテンツ内に多くの重複する文字列があります。
以下は、ロードされたデータに必要となる可能性のあるもののいくつかの例です。
- 指定された文字列と一致しようとするすべての文字列を検索し、一致する文字列を返します
- 一致を GUI テーブルに表示します (フィールドでソート可能)。
- 文字列を変更または置換します。
私の質問 - データを保持するために必要なメモリが少なくても、データを簡単かつ迅速に検索/並べ替える機能を提供するコレクションはありますか?