2


0

私は順次大きなファイルを処理しています、そしてそれを64ビットのシステムで利用可能な16ギガバイトのRAMにメモリに保存したいのですが。

簡単で汚い方法はこれをすることです、単に入力ストリームをバッファされた入力ストリームにラップすることです、残念ながら、これは私に2GBバッファを与えるだけです。 もっとメモリに入れたいのですが、他にどのような方法がありますか?

5 Answer


3


OSにファイルのバッファリングを処理させるのはどうですか。 ファイル全体をJVMのメモリーにコピーしないことによるパフォーマンスへの影響を確認しましたか?

編集:その後、RandomAccessFileまたはFileChannelを使用して、ファイルの必要な部分を効率的にJVMのメモリに読み込むことができます。


3


java.nioのMappedByteBufferを検討しましたか? それは私の頭の上ですが、多分それはあなたが探しているものです。


1


とにかく一度に2GB以上のバッファリングが大きな勝利になるとは思わない。 実行している処理の量によっては、処理するのとほぼ同じ速度で読み込むことができる場合があります。 それをスピードアップするために、2スレッドのプロデューサ - コンシューマモデルを使用することを試みるかもしれません(1つのスレッドがファイルを読み、処理のために他のスレッドにデータを渡します)。


1


OSは可能な限り多くのファイルをキャッシュしようとしているので、キャッシュマネージャを凌駕しようとしても、おそらくあなたを得ることはできないでしょう。

パフォーマンスの観点から見ると、バイトをJVMの外部に保持すると、はるかに役立ちます(OSとJVMの間で大量のデータを転送するのは比較的低速です)。 この目的を達成するには、ダイレクトメモリブロックを基盤とするMappedByteBufferを使用します。

適切なハウツータイプの記事は次のとおりです。 article


0


非標準の制限をサポートする64ビットJVMがあると思います。

あなたはチャンクをバッファリングすることを試みるかもしれません。