大きなファイルを順次処理していますが、その大きなチャンクをメモリに保持したいと考えています。64 ビット システムでは 16 GB RAM を使用できます。
これを行う手っ取り早い方法は、単純に入力ストリームをバッファリングされた入力ストリームにラップすることです。残念ながら、これでは 2 GB のバッファしか得られません。もっと記憶に残しておきたいのですが、他にどのような方法がありますか?
大きなファイルを順次処理していますが、その大きなチャンクをメモリに保持したいと考えています。64 ビット システムでは 16 GB RAM を使用できます。
これを行う手っ取り早い方法は、単純に入力ストリームをバッファリングされた入力ストリームにラップすることです。残念ながら、これでは 2 GB のバッファしか得られません。もっと記憶に残しておきたいのですが、他にどのような方法がありますか?
OS にファイルのバッファリングを処理させるのはどうですか? ファイル全体を JVM メモリにコピーしない場合のパフォーマンスへの影響を確認しましたか?
編集: 次に、RandomAccessFile または FileChannel のいずれかを使用して、ファイルの必要な部分を効率的に JVM メモリに読み込むことができます。
java.nio の MappedByteBuffer を検討しましたか? それは私の頭の上にありますが、多分それはあなたが探しているものです.
OS は可能な限り多くのファイルをキャッシュするため、キャッシュ マネージャーの裏をかこうとしても、おそらくあまり効果がありません。
パフォーマンスの観点からは、バイトを JVM の外部に保持することで、はるかに優れたサービスが提供されます (OS と JVM の間で大量のデータを転送するのは比較的低速です)。この目標は、ダイレクト メモリ ブロックに基づく MappedByteBuffer を使用することで達成できます。
関連するハウツー タイプの記事を次に示します 。
いずれにせよ、一度に 2 GB 以上をバッファリングすることが大きなメリットになるとは思えません。実行している処理の量によっては、処理とほぼ同じ速さで読み込むことができる場合があります。高速化するには、2 スレッドのプロデューサー/コンシューマー モデルを使用してみてください (1 つのスレッドがファイルを読み取り、データを別のスレッドに渡して処理します)。
非標準の制限をサポートする 64 ビット JVM があると思います。
チャンクをバッファリングしてみてください。