2015-10-20 60 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(); 

上面的代码是与缓冲器大小