6

少しの間見回していて、この問題について少し混乱しています。入力ストリームを取得して、セグメントで同時に読み取ることができるようにしたいと考えています。セグメントは互いに相互作用しません。アップロードされたファイルからデータベースに挿入または更新される値にすぎません。セグメントサイズを設定し、変換と挿入/更新を処理するために新しいスレッドをスピンオフする前に前方にスキップすることで、入力ストリームを同時に読み取ることは可能ですか?

基本的に、ファイルは ID のリスト (1 行に 1 つの ID) ですが、セパレーターを指定できれば望ましいでしょう。一部のファイルは巨大になる可能性があるため、データベースに挿入/更新した後に JVM メモリを解放できるように、データを処理してセグメントに変換したいと考えています。これは可能ですか?もしそうなら、すでにこれを行っているライブラリはありますか?

乾杯と前もって感謝します,

アレクセイ・ブルー。

4

3 に答える 3

2

まず、異なるオフセットから同時にファイルを読み取るには、ファイルへのランダムアクセスが必要です。これは、任意の位置からファイルを読み取ることを意味します。Java は、java.in の RandomAccessFile または java.nio の SeekableByteChannel でこれを許可します。

Java でファイルの途中にバイトを書き込む最良の方法

http://docs.oracle.com/javase/tutorial/essential/io/rafs.html

速度の理由から、java.nio を好むと思います。 Java NIO FileChannel と FileOutputstream のパフォーマンス/有用性

これで、任意の位置から読み取る方法がわかりましたが、これを同時に行う必要があります。ファイル内の位置を保持しているため、同じファイル アクセス オブジェクトでは不可能です。したがって、スレッドと同じ数のファイル アクセス オブジェクトが必要です。あなたは書いているのではなく読んでいるので、それはOKです。

これで、多くの異なるオフセットから同じファイルを同時に読み取る方法がわかりました。

しかし、パフォーマンスについて考えてみてください。ディスク ドライブが 1 つしかなく、ランダム読み取り (多くのスレッドが同じファイルにアクセスする) のスレッド数にもかかわらず、パフォーマンスはシーケンシャル読み取り (1 つのスレッドが 1 つのファイルを読み取る) よりもはるかに遅くなります。レイド0でもレイド1でも構いません。順次読み取りは、常にはるかに高速です。したがって、あなたの場合、あるスレッドでファイルを読み取り、その読み取りスレッドからのデータを他のスレッドに提供することをお勧めします。

于 2013-04-23T06:09:41.493 に答える