5

大きな CSV 形式のファイル (通常は 200 ~ 600 MB) を Java で効率的に読み込もうとしています (メモリが少なく、アクセスが可能な限り高速です)。現在、プログラムは文字列配列のリストを利用しています。この操作は以前、各 CSV 行のテーブルと各「行」テーブルを保持するテーブルを使用する Lua プログラムで処理されていました。

以下は、メモリの違いとロード時間の例です。

  • CSV ファイル - 232MB
  • Lua - メモリ内 549MB - 読み込みに 157 秒
  • Java - 1,378MB のメモリ - 読み込みに 12 秒

私の記憶が正しければ、Lua テーブル内の重複項目は実際の値への参照として存在します。Java の例では、List が各重複値の個別のコピーを保持しており、それがより大きなメモリ使用量に関連している可能性があると思われます。

以下は、CSV ファイル内のデータの背景です。

  • 各フィールドは String で構成されます
  • 各行内の特定のフィールドには、文字列のセットの 1 つが含まれる場合があります (たとえば、フィールド 3 は「赤」、「緑」、または「青」である可能性があります)。
  • コンテンツ内に多くの重複する文字列があります。

以下は、ロードされたデータに必要となる可能性のあるもののいくつかの例です。

  • 指定された文字列と一致しようとするすべての文字列を検索し、一致する文字列を返します
  • 一致を GUI テーブルに表示します (フィールドでソート可能)。
  • 文字列を変更または置換します。

私の質問 - データを保持するために必要なメモリが少なくても、データを簡単かつ迅速に検索/並べ替える機能を提供するコレクションはありますか?

4

5 に答える 5

1

1 つの簡単な解決策。HashMapすべての一意の文字列への参照を配置する場合は、いくつかを指定できます。では、ArrayList既存の一意の文字列を参照するだけですHashMap

何かのようなもの :

private HashMap<String, String> hashMap = new HashMap<String, String>();

public String getUniqueString(String ns) {
   String oldValue = hashMap.get(ns);
   if (oldValue != null) { //I suppose there will be no null strings inside csv
    return oldValue;
   }        
   hashMap.put(ns, ns);
   return ns;
}

簡単な使い方:

List<String> s = Arrays.asList("Pera", "Zdera", "Pera", "Kobac", "Pera", "Zdera", "rus");
List<String> finS = new ArrayList<String>();
for (String er : s) {
   String ns = a.getUniqueString(er);
   finS.add(ns);
}
于 2012-11-11T16:32:34.130 に答える
0

サイドノートとして。

疑わしい重複文字列データについては、Java自体がすべての文字列が最終的なものであり、すべての参照がメモリ内の同じオブジェクトを対象としているため、Java自体がそれを処理するため、心配する必要はありません。

luaがどのように機能するかはわかりませんが、Javaでは非常に効率的です。

于 2012-11-11T16:12:22.790 に答える
0

メモリの問題を最適化するには、特に多くの重複があるフィールドに対して、 Flyweightパターンを使用することをお勧めします。

Collection として、TreeSetまたはTreeMapを使用できます。

LineItemクラスに適切な実装(implementおよびComparableequals ) を与えると、メモリの使用を大幅に最適化できます。hashcode

于 2012-11-11T15:50:01.457 に答える
0

DAWG

有向非巡回ワード グラフは、ワードを格納する最も効率的な方法です (いずれにせよ、メモリ消費に最適です)。

しかし、おそらくここではやり過ぎです。他の人が言っているように、重複を作成しないで、同じインスタンスへの複数の参照を作成するだけです。

于 2012-11-11T15:51:33.957 に答える
0

たぶん、この記事が役立つかもしれません:

http://www.javamex.com/tutorials/memory/string_ Saving_memory.shtml

于 2012-11-11T15:52:31.833 に答える