Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何提高Java中读取大文件的速度?_Java_Java Io - Fatal编程技术网

如何提高Java中读取大文件的速度?

如何提高Java中读取大文件的速度?,java,java-io,Java,Java Io,我刚刚读了一个文件,它的大小是167MB,行号是1884000。我使用的方法是BufferedReader,以获得在线读取的效果 我注意到,随着当前行号的增加,读取文件的过程越来越慢(在这种情况下,我需要3h30min才能完成) 我知道使用nio可能会加快这个过程,但我想直接读取文件 我的代码如下;谁能给我一些建议吗?非常感谢 String htmlContentPath = html.getAbsolutePath(); BufferedReader reader = new Buffere

我刚刚读了一个文件,它的大小是167MB,行号是1884000。我使用的方法是
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()的调用,然后使用其他一些答案来加快文件的读取速度(这应该是整个执行时间,因为您注释掉了处理调用)

进一步考虑,如果您使用Eclipse,我建议您使用一个探查器(没有注释掉任何行),Eclipse Marketplace上有几个JVM探查器,并且我确信也有集成到其他IDE中的概要文件。分析器可以向您显示代码中的热点——您大部分时间似乎都在这些地方。这些信息,加上您对程序逻辑的了解,将产生加速最严重瓶颈的方法

这是一个迭代过程,结果越来越好


我还建议您首先使用更小的示例文件进行测试。

这听起来像是内存问题(由于内存不足,垃圾收集的需求增加时,速度会降低)

您发布的代码看起来不应该随着行号的增加而变慢(假设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
阅读行,这已经满足了你的前两点。