長年の読者、初めてのポスター。
一連のバイナリ ファイルからデータをすばやく読み取るのに少し問題があります。ByteBuffers と MappedBytBuffers は私が必要とするパフォーマンスを提供しますが、ウォームアップするために最初の実行が必要なようです。それが理にかなっているのかどうかわからないので、ここにいくつかのコードがあります:
int BUFFERSIZE = 864;
int DATASIZE = 33663168;
int pos = 0;
// Open File channel to get data
FileChannel channel = new RandomAccessFile(new File(myFile), "r").getChannel();
// Set MappedByteBuffer to read DATASIZE bytes from channel
MappedByteBuffer mbb = channel.map(FileChannel.MapMode.READ_ONLY, pos, DATASIZE);
// Set Endianness
mbb.order(ByteOrder.nativeOrder());
ArrayList<Double> ndt = new ArrayList<Double>();
// Read doubles from MappedByteBuffer, perform conversion and add to arraylist
while (pos < DATASIZE) {
xf = mbb.getDouble(pos);
ndt.add(xf * cnst * 1000d + stt);
pos += BUFFERSIZE;
}
// Return arraylist
return ndt;
したがって、これを実行するには約 7 秒かかりますが、もう一度実行すると 10 ミリ秒で完了します。正しい動作を設定するには、何らかの初期実行を行う必要があるようです。次のような単純なことを行うことで、次のように機能することがわかりました。
channel = new RandomAccessFile(new File(mdfFile), "r").getChannel();
ByteBuffer buf = ByteBuffer.allocateDirect(DATASIZE);
channel.read(buf);
channel.close();
これには約 2 秒かかります。その後、MappedByteBuffer プロシージャを実行すると、10 ミリ秒でデータが返されます。その初期化ステップを取り除き、最初に10ミリ秒でデータを読み取る方法がわかりません。「ウォーミングアップ」、JIT、および JVM についてあらゆる種類のことを読みましたが、すべて役に立ちませんでした。
それで、私の質問は、10ミリ秒のパフォーマンスをすぐに得ることは可能ですか、それとも何らかの初期化を行う必要がありますか? もしそうなら、これを行うための最速の方法は何ですか?
このコードは約 1000 個の非常に大きなファイルを処理することを目的としているため、速度が非常に重要です。
どうもありがとう。