SQLクエリからの結果をに保存していますArraylist<Hashtable<String, String>>
。各結果はハッシュテーブルに保存され、次に各結果はリストに保存されます
結果が 100.000 未満の場合は問題なく動作し、取得した結果がさらに多い場合は buf で、OutOfMemory 例外が発生します。
この状況を改善する方法について何か提案はありますか?
カスタムクラスを使用して各行を表すことにより、おそらくスペースを節約できます。(AHashMap
はかなり「メモリを大量に消費する」データ構造です。)しかし、それは避けられないOOMEを先延ばしにするだけです。
結果セット全体をメモリに保存する必要がないように、アプリケーションを変更することをお勧めします。
いくつかの異なるアプローチがあります。Stechen Cは正しいです。結果セットのサイズを小さくするには、SQLで「where」句を使用するのが最適です。
キャッシュを使用している場合は、キャッシュの最大サイズを設定できます。そのための最適なクラスはLinkedHashMapです。挿入順序を維持するMapの実装があります。Javadocに示されているように、サブクラス化してremoveEldestEntry()メソッドをオーバーライドする必要があります。
これを改善するための最も簡単でおそらく最もメモリ消費の少ない方法は、データの 2 次元配列を保持することです。
String[][] data;
// Alternatively, if you prefer lists:
List<String[]> data;
次に、次のような追加のデータ構造が 1 つだけ必要になります。
Map<String, Integer> fieldNameToIndexMapping;
...列インデックスでフィールドにアクセスするためのルックアップテーブルを保存する場所。例えば
String value = data[row][fieldNameToIndexMapping.get("MY_COLUMN")];
必要に応じて、より簡潔なデータ型を使用することで、より多くのチューニングが可能です。String
データ構造に格納している値の一部は実際にBoolean
は でInteger
あり、その他のアイテムは文字列以外の形式で格納する方が簡単だと思います。