サイズが16,512(128 x 129)の整数の配列がそれぞれ約2,000,000(200万)あるプログラムを実装しています。一度に200個のアレイ(つまり3.3 MB)を呼び出すだけで済みますが、プログラムを200万個(たとえば2億個)以上に拡張できるかどうか疑問に思いますが、それでも一度に200個のアレイを呼び出すだけで済みます。では、一度に200を超えるアレイを使用しない場合に、アレイをどんどん作成することの制限は何ですか?
3 に答える
大量のRAMと非常に大きなヒープを備えた64ビットマシンで実行しているのでない限り、私は非常に疑わしいです。
データに必要なメモリを計算してみましょう。
2,000,000*128*129*8/1024/1024/1024 = 30.8GB.
JVM、プログラムの残りの部分、およびオペレーティングシステム用に追加のRAMが必要になります。
私にはよく考えられていない解決策のように聞こえます。
「一度にメモリに200個のアレイしかない」という意味であれば、確かにそれは可能ですが、残りをセカンダリストレージまたはリレーショナルデータベースに移動する必要があります。それらを照会し、使用し、GCします。それは最善の解決策ではないかもしれませんが、あなたが投稿した小さなものに基づいて判断するのは難しいです。
アップデート:
「トリガー」は「データベーストリガー」を意味しますか?
はい、ディスクに保存できます。私はそれが実行されることを保証することはできません。あなたのハードドライブは確かに30GBのデータを処理できます。十分な大きさであれば、300GBを収容することは可能です。
RAMをどのように管理するかを考える必要があることを忘れないでください。GCのスラッシングが問題になる可能性があります。良いキャッシングソリューションはここであなたの友達かもしれません。自分で書いてはいけません。
そのハードドライブに障害が発生し、すべてのデータが失われた場合はどうなりますか?バックアップしますか?ディスクに障害が発生した場合、アプリをダウンさせる余裕はありますか?それらのシナリオについても考えてください。幸運を。
不要になった配列への参照を保持しない限り、厳しい制限はありません。古いアレイは自動的にガベージコレクションを取得するため、アレイの割り当てと放棄をほぼ無限に続けることができます。
もちろん、常に保持できるアレイの数には制限があります。これは、JVMで使用可能なメモリの量によって制限されます。
アプリケーションのメモリが不足しないように最大ヒープサイズを増やす限り、問題はありません。