私は組み込みLinuxデバイスでJava 1.5を使用し、2MBのint値を持つバイナリファイルを読み込みたいとします。 (今ビッグエンディアンは4バイト、私は決めることができ、フォーマット)dis.readInt()
を使用してBufferedInputStream
経由DataInputStream
を使用してバイナリファイルから膨大な数のintを読み込む最速の方法
)、これらの500回の000のコールが読み17Sが必要ですが、一つの大きなバイトのバッファに読み込まれたファイルには、5秒を必要とします。
私はそのファイルをより速く1つの巨大なint []に読み込むことができますか?
読み取りプロセスでは、512 KBを超えて使用しないでください。
nio
を使用するこのコードは、java ioのreadInt()アプローチより高速ではありません。
// asume I already know that there are now 500 000 int to read:
int numInts = 500000;
// here I want the result into
int[] result = new int[numInts];
int cnt = 0;
RandomAccessFile aFile = new RandomAccessFile("filename", "r");
FileChannel inChannel = aFile.getChannel();
ByteBuffer buf = ByteBuffer.allocate(512 * 1024);
int bytesRead = inChannel.read(buf); //read into buffer.
while (bytesRead != -1) {
buf.flip(); //make buffer ready for get()
while(buf.hasRemaining() && cnt < numInts){
// probably slow here since called 500 000 times
result[cnt] = buf.getInt();
cnt++;
}
buf.clear(); //make buffer ready for writing
bytesRead = inChannel.read(buf);
}
aFile.close();
inChannel.close();
更新:回答の評価:
PCでメモリマップIntBufferのアプローチでは、私のセットアップで最速でした。埋め込まれたデバイス上
は、JITなし、java.io DataiInputStream.readInt()は少し速く(IntBufferとMemMapため17S、20S VS)であった
最終的な結論: 著しい速度アップは、ビア達成することが容易ですアルゴリズムの変更。あなたはNIOパッケージからIntBuffer
を使用することができます
http://makeprogrammingyourforte.blogspot.in/2012/09/fastestway-to-read-input-in-java.html – Algorithmist
@Algorithmist @あなたのリンクを確認しましたが、テキストから読み込みますファイル – AlexWien
バークレーにはバルクIO JNI拡張機能があります(こちらはhttp://www.cs.berkeley.edu/~bonachea/java/)。私はそれを使用していないが、それは見た目には良いかもしれない。 –