0

1.5 GB のファイルを配列に読み込みたい。さて、時間がかかるので、他のオプションに切り替えたいと思います。誰か助けてくれませんか

バイトファイルをデータベースに前処理すると(または他の方法で)、高速化できますか?

誰でも私を助けることができますか?それを高速化する他の方法はありますか?

実際には、1.5GB のファイルを 50 個以上処理する必要があります。だから、そのような操作は私にとってかなり高価です。

4

3 に答える 3

1

それはあなたが何をしたいかによります。

いくつかのランダムなバイトにアクセスしたいだけなら、配列への読み込みは良くありません - MappedByteBuffer の方が良いでしょう。

すべてのデータを読み取り、一度に少しずつ順次処理する場合は、ストリーミングできます。

データセット全体のランダム アクセスを行う計算を行う必要がある場合、特に要素を繰り返し読み取る必要がある場合は、配列への読み込みが賢明かもしれません (ただし、ByteBuffer は依然として候補です)。

コードの例を示したり、さらに説明したりできますか?

于 2012-07-31T19:22:53.890 に答える
1

ディスク サブシステムの速度は?

1 秒あたり 40 MB を読み取ることができる場合、1500 MB の読み取りには約 40 秒かかります。これよりも速くしたい場合は、より高速なディスク サブシステムが必要です。ローカル ドライブから読み取りを行っていて、数分かかる場合は、チューニングの問題があり、これを修正するために Java を実行できることはあまりありません。これは問題ではないためです。

代わりにメモリ マップ ファイルを使用できますが、すべてのデータが必要ない場合にのみアクセスが高速化されます。すべてが必要な場合は、ハードウェアの速度によって制限されます。

于 2012-07-31T17:22:49.380 に答える
0

BufferedInputStream または InputStream を使用すると、おそらく可能な限り高速になります (RandomAccessFile よりも高速です)。最大の int サイズは 2,147,483,647 であるため、配列の最大サイズでもある 1,610,612,736 の配列にいくらか近づいています。

最高の速度を得るには BufferedInputStream を使用してファイルにアクセスし、skip() と read() を使用して必要なデータを取得することをお勧めします。おそらく、それらを実装し、その位置を認識し、読み取るオフセットを送信するときにシークを処理するクラスを持っているでしょう。入力ストリームを閉じて再度開き、最初に戻すと思います。

そして...それらを配列に保存したくない場合があり、ファイルから必要に応じてアクセスするだけです。読み込み時間があなたのキラーである場合、それは役立つかもしれません.

于 2012-07-31T17:30:36.620 に答える