2015-05-11 152 views
1

我需要在文件中存儲具有80,000項的布爾數組。我不在乎節省多少時間,我只關心數組的加載時間。 我沒有嘗試通過DataOutputStream存儲它,因爲它需要訪問每個值。Java存儲文件中的布爾數組並快速讀取

我試圖3種的方法,例如,使這個:

  1. 連載布爾數組使用位集合的
  2. 代替布爾陣列的序列化
  3. 轉印布爾數組成字節數組,其中1是true和0是錯誤的適當,並寫入FileChannel使用ByteBuffer

要測試從這些方法的文件讀取,我已經在循環中運行每個方法1000次。所以,我的結果看起來是這樣的:

  1. 反序列化布爾數組的需要574毫秒
  2. 反序列化位集合的 - 379毫秒
  3. 通過MappedByteBuffer獲取字節數組從FileChannel - 170毫秒

第一種和第二種方法太長,第三種方法可能根本沒有辦法。

或許有實現它最好的辦法,所以我需要你的意見

編輯

每種方法都跑了一次

  1. 13.8
  2. 8.71
  3. 6.46 ms專用
+0

您如何衡量這些數據的執行結果? –

+0

在一個循環中加載相同的文件1000次並不會給你真正意義上的每個迭代需要多長時間 - 第一個將會慢得多,並且之後文件系統緩存將會啓動。 –

+0

@Luiggi我已經運行了每個循環他們有1000次循環,需要時間通過System.currentTimeMills()或System.nanoTime() –

回答

4

如何爲每個布爾值寫一個字節並開發一個自定義分析器?這將是最快速的方法之一。 如果你想節省空間,你也可以把8個布爾值放到一個字節中,但這需要一些位移操作。

下面是一個簡單的例子的代碼:

public void save() throws IOException 
{ 
    boolean[] testData = new boolean[80000]; 
    for(int X=0;X < testData.length; X++) 
    { 
     testData[X] = Math.random() > 0.5; 
    } 
    FileOutputStream stream = new FileOutputStream(new File("test.bin")); 

    for (boolean item : testData) 
    { 
     stream.write(item ? 1 : 0); 
    } 
    stream.close(); 
} 

public boolean[] load() throws IOException 
{ 
    long start = System.nanoTime(); 
    File file = new File("test.bin"); 
    FileInputStream inputStream = new FileInputStream(file); 
    int fileLength = (int) file.length(); 

    byte[] data = new byte[fileLength]; 
    boolean[] output = new boolean[fileLength]; 

    inputStream.read(data); 
    for (int X = 0; X < data.length; X++) 
    { 
     if (data[X] != 0) 
     { 
      output[X] = true; 
      continue; 
     } 
     output[X] = false; 
    } 
    long end = System.nanoTime() - start; 
    Console.log("Time: " + end); 
    return output; 
} 

大約需要2ms的加載80.000布爾值。 使用JDK測試1.8.0_45

+0

用代碼示例的第一個答案,謝謝你,我會試試這個 –

+0

在我的機器上需要4到6毫秒,有趣的,但我使用JDK 1.7.0_79 –

+0

字節數組的讀取需要0.71毫秒,這是驚人的 我不能理解爲什麼nio讀取80.000字節6毫秒,當FileInputStream只有一半的毫秒? –

相關問題