2

たとえば、メモリ制限を超える大量のデータ読み取る必要がある時間の20%がアプリケーションの一部です。メモリ制限を増やすことはできますが、ほとんどの場合必要ない場合は高い割り当てが必要になるため、そうすることを躊躇します。

このようなピーク負荷に達したときに、カスタマイズされたjava.util.List実装を使用してディスクにスプールすることを検討していますが、より軽い状況ではメモリに残ります。

データはコレクションに一度ロードされ、その後繰り返されて処理され、その後破棄されます。コレクションに追加されたら、並べ替える必要はありません。

誰かがそのようなアプローチに関して賛否両論を持っていますか?

このようなリストの実装を提供するオープンソース製品はありますか?

ありがとう!

更新:

  • 生意気ではありませんが、「巨大な」とは、同じハードウェア上の他のプロセスに干渉することなく、割り当てたいメモリの量を超えることを意味します。他にどのような詳細が必要ですか?
  • このアプリケーションは、基本的に、複数のデータベーステーブルからデータをロードし、その上で広範なビジネスロジックを実行するバッチプロセッサです。集計操作は実行されるロジックの一部であるため、リスト内のすべてのデータが必要です。
  • 私はちょうどこの投稿に出くわしました。これは非常に良いオプションを提供します:Javaで同等のSTXXL
4

5 に答える 5

6

本当にリストを使用する必要がありますか? 代わりに、データをステップ実行するIterator の実装を記述します ( AbstractIteratorを拡張すると役立つ場合があります)。次に、そのイテレータでこれらのような便利なユーティリティを利用できます。これにより、膨大な量のデータが熱心にメモリにロードされることはありません。代わりに、イテレータが進められたときにのみレコードがソースから読み取られます。

于 2009-11-04T01:22:41.383 に答える
2

膨大な量のデータを扱っている場合は、代わりにデータベースの使用を検討することをお勧めします。

于 2009-11-04T01:26:24.817 に答える
1

データベースにバックアップし、アイテムの遅延読み込みを実行します。

ORMフレームワークが適切である可能性があります。それはあなたの使用法に依存します。それはかなり簡単かもしれませんし、あなたの悪夢の中で最悪の場合、あなたが説明したことから見分けるのは難しいかもしれません。

私は楽観的で、ORMフレームワーク(Hibernateなど)を使用すると、約3〜5日で問題が解決すると思います。

于 2009-11-04T01:32:06.200 に答える
0

データがコレクションに読み込まれている間に行われている並べ替え/処理はありますか?どこから読んでいますか?

すでにディスクから読み取られている場合、リストに完全に読み込んでから繰り返すのではなく、ディスクから直接バッチ処理することは可能でしょうか?データはどの程度相互依存していますか?

于 2009-11-04T00:44:40.767 に答える
0

また、データを処理するためにすべてのデータをメモリにロードする必要がある理由についても質問します。通常、ロード中に処理を実行して、結果を使用できるはずです。これにより、実際のデータがメモリから除外されます。

于 2009-11-04T01:45:43.967 に答える