Java で文字列の大きな配列を処理する必要があり、メモリに保持できません。このため、配列はいくつかのチャンクで処理する必要があります。各チャンクのサイズはプログラムのユーザーが指定できますが、ユーザーがサイズを指定しない場合、プログラムは最適なサイズを決定する必要があります。
私が最初に考えたのは、cassandra のようなディスク内データベースを使用することでした。そうすれば、大きな配列のチャンクを処理するたびに、データベースに対してクエリを実行できます。私が見た問題は、JVM と RAM の使用可能なメモリを制御する必要があるということでした。これは難しすぎると思います。また、各チャンクのサイズを設定して、使用可能なメモリをいっぱいにすることなく最大限に活用する方法を理解する必要があります。
そのために、MemCached や SSDB (データベースの一部をディスクに保存できる Redis の代替手段 - https://github.com/ideawu/ssdb ) のようなものを使用することを考えましたが、よくわかりません。それが最良の選択肢である場合。Memcached または SSDB は、メモリがいっぱいになるのを避けるための制御を実装する必要なく、メモリとディスク間のデータ交換を管理するのに役立つという考えです。
本当に、プログラムを機能させるためだけに依存関係 (Memcached または SSDB) を追加するという考えはあまり好きではありません。
次に、私の質問は次のとおりです。私の問題を解決するための良い代替手段はありますか? これまでの推論は間違っていますか?
前もって感謝します!
説明 ---------------
どのような処理を行う必要がありますか? 処理は、既存のデータ (大きな配列内) を使用して情報を取得するためのデータ分析手法に関連しています。
配列の大きさは?弦の大きさは?処理はランダム アクセスですか、シーケンシャルですか。なぜファイルを使用できないのですか? 配列のサイズは変更される可能性があり、固定値ではありません。アイデアは、ユーザー (エンドユーザーではない) が必要なときに配列をチャンクで処理できるということです。たとえば、サイズ 100.000 の配列をいくつかのチャンクで処理したいユーザーがいるかもしれませんが、配列のサイズが 1.000.000 未満の場合 (メモリのサイズによって異なります)、他のユーザーはいくつかのチャンクで配列を処理する必要はありません。各ユーザーの)。私の処理はシーケンシャルです。このページの他の質問では、ファイルではなくデータベースを使用することをお勧めしているため、ファイルは使用しません。さらに、ファイルを使用した場合、使用可能なメモリ領域を制御する必要があり、
処理したい文字列はどこにありますか? それらはすでにどこかに保存されていますか、それともその場で何らかの方法で生成しますか? 文字列はユーザーから取得され、配列に完全に格納されました。ここでのアイデアは、ユーザーから渡された文字列をデータベースに保存し、後で (ユーザーが決定したときに) 文字列の処理が行われることです (文字列をデータベースに保存した直後である必要はありません)。