0

長年の読者、初めてのポスター。

一連のバイナリ ファイルからデータをすばやく読み取るのに少し問題があります。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 個の非常に大きなファイルを処理することを目的としているため、速度が非常に重要です。

どうもありがとう。

4

1 に答える 1

1

その初期化ステップを取り除き、最初に10ミリ秒でデータを読み取る方法がわかりません

できません。データはディスクから読み取る必要があります。それには10ms以上かかります。10 ミリ秒は、それが既にメモリにある場合の他のすべての時間です。

于 2014-03-31T10:05:23.150 に答える