1.5 GB のファイルを配列に読み込みたい。さて、時間がかかるので、他のオプションに切り替えたいと思います。誰か助けてくれませんか
バイトファイルをデータベースに前処理すると(または他の方法で)、高速化できますか?
誰でも私を助けることができますか?それを高速化する他の方法はありますか?
実際には、1.5GB のファイルを 50 個以上処理する必要があります。だから、そのような操作は私にとってかなり高価です。
1.5 GB のファイルを配列に読み込みたい。さて、時間がかかるので、他のオプションに切り替えたいと思います。誰か助けてくれませんか
バイトファイルをデータベースに前処理すると(または他の方法で)、高速化できますか?
誰でも私を助けることができますか?それを高速化する他の方法はありますか?
実際には、1.5GB のファイルを 50 個以上処理する必要があります。だから、そのような操作は私にとってかなり高価です。
それはあなたが何をしたいかによります。
いくつかのランダムなバイトにアクセスしたいだけなら、配列への読み込みは良くありません - MappedByteBuffer の方が良いでしょう。
すべてのデータを読み取り、一度に少しずつ順次処理する場合は、ストリーミングできます。
データセット全体のランダム アクセスを行う計算を行う必要がある場合、特に要素を繰り返し読み取る必要がある場合は、配列への読み込みが賢明かもしれません (ただし、ByteBuffer は依然として候補です)。
コードの例を示したり、さらに説明したりできますか?
ディスク サブシステムの速度は?
1 秒あたり 40 MB を読み取ることができる場合、1500 MB の読み取りには約 40 秒かかります。これよりも速くしたい場合は、より高速なディスク サブシステムが必要です。ローカル ドライブから読み取りを行っていて、数分かかる場合は、チューニングの問題があり、これを修正するために Java を実行できることはあまりありません。これは問題ではないためです。
代わりにメモリ マップ ファイルを使用できますが、すべてのデータが必要ない場合にのみアクセスが高速化されます。すべてが必要な場合は、ハードウェアの速度によって制限されます。
BufferedInputStream または InputStream を使用すると、おそらく可能な限り高速になります (RandomAccessFile よりも高速です)。最大の int サイズは 2,147,483,647 であるため、配列の最大サイズでもある 1,610,612,736 の配列にいくらか近づいています。
最高の速度を得るには BufferedInputStream を使用してファイルにアクセスし、skip() と read() を使用して必要なデータを取得することをお勧めします。おそらく、それらを実装し、その位置を認識し、読み取るオフセットを送信するときにシークを処理するクラスを持っているでしょう。入力ストリームを閉じて再度開き、最初に戻すと思います。
そして...それらを配列に保存したくない場合があり、ファイルから必要に応じてアクセスするだけです。読み込み時間があなたのキラーである場合、それは役立つかもしれません.