2015-10-20 58 views
2

我將超過40,000個對象存儲到文本文件中。我的問題正在讀取文本文件中的所有對象太慢。它甚至需要4349毫秒的1,000個對象 - 文本文件。閱讀大對象文本文件的最快方法

這是從文本文件中讀取對象。

long startR = System.currentTimeMillis(); 

try{ 
    ois = new ObjectInputStream(new FileInputStream(f)); 
    code_from_file.clear(); 
    Codes obj = new Codes(); 

    while((obj = (Codes) ois.readObject()) != null){ 
     if(obj instanceof Codes){ 
      code_from_file.add(obj); 
     } 
    } 

}catch (EOFException ex){ 

} catch (ClassNotFoundException ex) { 
    ex.printStackTrace(); 
} catch (FileNotFoundException ex) { 
    ex.printStackTrace(); 
} catch (IOException ex) { 
    ex.printStackTrace(); 
} finally{ 
    try { 
     if (ois != null){ 
      ois.close(); 
     } 
    } catch (IOException ex){ 
     ex.printStackTrace(); 
    } 
} 

long endR = System.currentTimeMillis(); 
System.out.println("Read code from file : " + (endR - startR) + "ms"); 

是否有解決這個問題的任何更快的方法?

+2

你嘗試ehcache的的固定寬度的? –

+1

嘗試用bufferedinputstream包裝它。 ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream(f))); – Eddie

回答

2

一個簡單的優化嘗試將添加緩衝到您的輸入流處理。正如你寫的那樣,每次讀取都可能會觸及你的磁盤。如果您執行較少的物理讀取(大塊),您可能會看到性能改進。

int bufferSize = 16 * 1024; 
ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream(f), bufferSize)); 

當通過ObjectInputStream讀取字節時,它們實際上是從BufferedInputStream的緩衝區中讀取到內存中的。當這個緩衝區變爲空時(全部被讀取),BufferedInputStream將從FileInputStream中重新填充緩衝區。

您可以嘗試使用不同的緩衝區大小來確定I/O操作數量與內存開銷之間的適當平衡。

1

嘗試使用NIO,它有許多的改進和緩衝

RandomAccessFile aFile = new RandomAccessFile("test.txt", "r"); 
    FileChannel inChannel = aFile.getChannel(); 
    ByteBuffer buffer = ByteBuffer.allocate(1024); 
    int read; 
    while((read = inChannel.read(buffer)) != -1){ 
     os.write(buffer, 0, read); 
    } 
    inChannel.close(); 
    aFile.close(); 

上面的代碼是與緩衝器大小