如何提高Java中读取大文件的速度?
我刚刚读了一个文件,它的大小是167MB,行号是1884000。我使用的方法是如何提高Java中读取大文件的速度?,java,java-io,Java,Java Io,我刚刚读了一个文件,它的大小是167MB,行号是1884000。我使用的方法是BufferedReader,以获得在线读取的效果 我注意到,随着当前行号的增加,读取文件的过程越来越慢(在这种情况下,我需要3h30min才能完成) 我知道使用nio可能会加快这个过程,但我想直接读取文件 我的代码如下;谁能给我一些建议吗?非常感谢 String htmlContentPath = html.getAbsolutePath(); BufferedReader reader = new Buffere
BufferedReader
,以获得在线读取的效果
我注意到,随着当前行号的增加,读取文件的过程越来越慢(在这种情况下,我需要3h30min才能完成)
我知道使用nio
可能会加快这个过程,但我想直接读取文件
我的代码如下;谁能给我一些建议吗?非常感谢
String htmlContentPath = html.getAbsolutePath();
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(htmlContentPath)));
String line = null;
int cnt = 0;
while((line = reader.readLine()) != null) {
this.proc(line);
if((cnt++ % 2000) == 0) {
logger.info("current line number:\t"+cnt);
}
}
这可能是由交换引起的,根据proc方法中文件的内存占用情况,您可以对进程执行visualVM以查看堆状态,然后调整(xms,xmx)/减少方法的内存消耗
干杯。您应该可以在这里找到答案: 要获得最佳Java读取性能,需要记住四件事:
- 通过一次读取一个数组而不是一个字节来最小化I/O操作。8Kbyte数组大小合适
- 通过一次获取一个数组而不是一个字节的数据来最小化方法调用。使用数组索引获取数组中的字节数
- 如果不需要线程安全,请最小化线程同步锁。对线程安全类进行较少的方法调用,或者使用非线程安全类,如FileChannel和MappedByteBuffer
- 尽量减少JVM/OS、内部缓冲区和应用程序阵列之间的数据复制。使用带有内存映射的FileChannel,或直接或包装的数组ByteBuffer
我还建议您首先使用更小的示例文件进行测试。这听起来像是内存问题(由于内存不足,垃圾收集的需求增加时,速度会降低) 您发布的代码看起来不应该随着行号的增加而变慢(假设proc()调用为“clean”) 我听Chris G的建议,删除proc()调用,看看当您只是阅读罚款,而没有处理罚款的任何一行时,是否仍会出现减速 我还想补充一点,您可以尝试使用-Xmx和-Xms标志,让JVM在一开始就可以访问更多内存
这里有一个可能相关的问题:proc(line)做什么?它运行的时间越长,是否会减慢速度?是否每次迭代都需要调用
this.proc(line)
。使用多线程2。正确同步线程3。使用Java NIO<代码>频道:)您不使用FileReader有什么原因吗?即使阅读速度慢,我也会得到100 MB/s的速度,我怀疑这不是阅读速度慢,而是您对文本的处理速度慢。@Ivan。我敢肯定。我只知道Eclipse,但评测是一个关键特性,您可以在任何IDE上找到它。对NetBeans或IntelliJ没有轻视的意思。他正在通过一个BufferedReader
阅读行,这已经满足了你的前两点。