在此將說明若我們產生一大量資料的binary file,如何透過set offset position來快速讀去指定區段的資料,如此一來就可以取代透過迴圈來走訪不需要的區段!
此binary file format可以參考如何輸出及讀取binary file,在此就不再贅述!
主要是針對write Integer data的部分進行資料追加,本來是輸出10筆亂數資料,在此將輸出100萬筆資料,並設定每20萬筆為一區間,每個區間輸出相同的數字,分別是10, 20,.., 50等等!
再來是讀取binary file的部分,在此同樣修改如何輸出及讀取binary file readBinaryFile method讀取資料的程式區塊,如下:
在此計算讀取時間,本來整個讀完100萬筆資料需要將近14秒多的時間,而透過skipBytes針對目前offset position要skip多少byte,在此是要去讀第80筆後的資料,因此需skip 800000 * 4 bytes,如此一來offset position會指到最後一個區段的start,也就是80萬到100萬之間。因此讀出來的第一筆資料就會是這個區間的數字為50! 而整體的時間也只剩下2.824秒左右!
印出來的console如下:
readBinaryFile...
START
50, 0
2824
END
此binary file format可以參考如何輸出及讀取binary file,在此就不再贅述!
首先是輸出大量資料的binary file,在此修改如何輸出及讀取binary file writeBinaryFile method輸出資料的程式區塊,如下:
int count = 1000000;
...
int threshold = count / 5;
int currIndex = -1;
int value = 0;
int index = 0;
for(int i = 0 ; i < count ; i++) {
index = i / threshold;
value = (index + 1) * 10;
ostream.writeInt(value);
if(index != currIndex) {
currIndex = index;
ostream.flush();
}
}
主要是針對write Integer data的部分進行資料追加,本來是輸出10筆亂數資料,在此將輸出100萬筆資料,並設定每20萬筆為一區間,每個區間輸出相同的數字,分別是10, 20,.., 50等等!
再來是讀取binary file的部分,在此同樣修改如何輸出及讀取binary file readBinaryFile method讀取資料的程式區塊,如下:
long currentTime = System.currentTimeMillis();
int value = 0;
int currVal = 0;
count = count - 800000;
istream.skipBytes(800000 * 4);//Integer -> 4 bytes
for(int i = 0 ; i < count ; i++) {
value = istream.readInt();
if(value != currVal) {
currVal = value;
System.out.println(currVal+", "+i);
}
}
long diff = System.currentTimeMillis() - currentTime;
System.out.println(diff);
在此計算讀取時間,本來整個讀完100萬筆資料需要將近14秒多的時間,而透過skipBytes針對目前offset position要skip多少byte,在此是要去讀第80筆後的資料,因此需skip 800000 * 4 bytes,如此一來offset position會指到最後一個區段的start,也就是80萬到100萬之間。因此讀出來的第一筆資料就會是這個區間的數字為50! 而整體的時間也只剩下2.824秒左右!
印出來的console如下:
readBinaryFile...
START
50, 0
2824
END
留言
張貼留言