我必須編寫一個用Java進行外部排序的算法,只使用JVM RAM(基本上,我不能映射文件)。因此,我想要做的第一部分是從塊中讀取文件中的數據。我發現this tutorial。外部排序優化
問題是,教程是關於閱讀byte
s,我必須閱讀int
s。我不確定IntBuffer
是如何實現的,但我認爲它是一個字節緩衝區的包裝。鑑於這個事實,我說我能做的最快的事情是使用教程中的「FileChannel with ByteBuffer和byte array」方法(下面的代碼),然後創建一個單獨的數組,並用「手動」方式創建單獨的數組,使用位操作從字節獲取?
FileInputStream f = new FileInputStream(name);
FileChannel ch = f.getChannel();
ByteBuffer bb = ByteBuffer.allocateDirect(BIGSIZE);
byte[] barray = new byte[SIZE];
long checkSum = 0L;
int nRead, nGet;
while ((nRead=ch.read(bb)) != -1)
{
if (nRead == 0)
continue;
bb.position(0);
bb.limit(nRead);
while(bb.hasRemaining())
{
nGet = Math.min(bb.remaining(), SIZE);
bb.get(barray, 0, nGet);
for (int i=0; i<nGet; i++)
checkSum += barray[i];
}
bb.clear();
}
另外,我有一個小的附加的問題:我想讀和排序在並行(I/O浪費了大量的時間),應該使用一種完全不同的方法,或者在一個正在使用此方法線程和排序在其他線程的好方法?我真的想爭取每一秒的表現。
我認爲你應該寫一些首先起作用的東西,然後*爭取達到納秒的性能。當你無法測量時,你將如何預測速度更快? –
什麼是「JVM RAM」? –