Java - How to quickly read a large number of data binary file

在此將說明若我們產生一大量資料的binary file,如何透過set offset position來快速讀去指定區段的資料,如此一來就可以取代透過迴圈來走訪不需要的區段!

此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

留言