3

私のプログラムでは、一連のテキスト ファイルをディスクから読み込んでいます。各テキスト ファイルで、いくつかのデータを処理し、結果を JSON としてディスクに保存します。この設計では、各ファイルに独自の JSON ファイルがあります。これに加えて、複数のファイルからの関連データを保存する別の JSON ファイルにも一部のデータを保存します。私の問題は、解析されるファイルごとに共有 JSON がどんどん大きくなり、最終的にメモリを使いすぎてしまうことです。私は 32 ビット マシンを使用しており、4 GB の RAM を使用していますが、Java VM のメモリ サイズをこれ以上増やすことができません。

考慮すべきもう 1 つの制約は、古い JSON を頻繁に参照することです。たとえば、FileY から ObjX を取り出したとします。疑似コードでは、次のことが起こります (JSON シリアライゼーション/デシリアライゼーションに Jackson を使用):

// In the main method.
FileYJSON = parse(FileY);
ObjX = FileYJSON.get(some_key);
sharedJSON.add(ObjX);

// In sharedJSON object
List objList;

function add(obj)
    if (!objList.contains(obj))
        objList.add(obj);

ストリーミング JSON を使用することしか考えられないのですが、問題は、以前の JSON に頻繁にアクセスする必要があるため、そのストリームが機能するかどうかわかりません。また、文字列だけでなく、Jackson のストリーミング機能を使用できないようにするデータ型もあります (私は信じています)。誰か良い解決策を知っていますか?

4

3 に答える 3

2

データ構造が大きくなりすぎてメモリ不足になる場合は、別のものを使用する必要があります。データベースを使用することをお勧めします。これにより、データの取得と保存が大幅に高速化されます。また、データ構造の制限を、RAM のサイズではなく、ハード ドライブのサイズにします。

Java とデータベースの概要については、このページをお試しください。

于 2012-07-10T21:44:57.863 に答える
1

テキストファイルと JSON のためだけに 4GB 近くの RAM が本当に必要だとは信じられません。

考えられる解決策は 3 つあります。

  1. 可能であれば、プレーン テキストに切り替えます。それは、メモリが飢えているわけではありません。
  2. 必要に応じてファイルを開いたり閉じたりするだけです。ハッシュの最初の 2 桁/3 桁など、特定の命名規則に従ってファイルを並べ替え、必要に応じて開くことができます。
  3. 非常に多くのデータがある場合は、データベースに切り替えることができます。これにより、多くのリソースを節約できます。

可能であれば、オプション 3 を希望します。

于 2012-07-10T21:48:09.643 に答える