BufferedReader的低性能

sam*_*rth 6 java text-processing readline seek bufferedreader

我正在逐行处理一些文本文件BufferReader.readlLine().

两个文件具有相同的大小130MB,但一个需要40秒才能处理,而其他文件需要75秒.

我注意到一个文件有180万行,而其他文件有210万行.但是,当我尝试处理具有相同大小的300万行的文件时,需要30分钟来处理.

所以我的问题是:

  1. 这种行为是因为寻求缓冲区读取器的时间(我想知道如何BufferedReader逐行工作或解析文件?)

  2. 有没有什么方法可以更快地逐行读取文件?

好的朋友,我提供更多细节.

我正在使用正则表达式将该行拆分为三个部分,然后使用SimpleUnsortedWriter(由Cassandra提供)我将其作为键,列和值写入某个文件.处理完16MB数据后,它会刷新到磁盘.

但是处理逻辑对于所有文件都是相同的,甚至一个大小为330MB的文件,但是在30秒内没有大约100万行的处理逻辑.可能是什么原因?

deviceWriter = new SSTableSimpleUnsortedWriter(
        directory,
        keyspace,
        "Devices",
        UTF8Type.instance,
        null,
        16);

Pattern pattern = Pattern.compile("[\\[,\\]]");
while ((line = br.readLine()) != null)          
{
    //split the line i n row column and value
    long timestamp = System.currentTimeMillis() * 1000;
    deviceWriter .newRow(bytes(rowKey));
    deviceWriter .addColumn(bytes(colmName), bytes(value), timestamp);

}
Run Code Online (Sandbox Code Playgroud)

已经改变了,-Xmx256M to -Xmx 1024M但无论如何都没有帮助.

更新: 根据我的观察,当我写入缓冲区(在物理内存中)时,就像没有.写入缓冲区正在增加新的写入需要时间.(这是我的猜测)

请回复.

Mic*_*rdt 6

唯一的BufferedReader做法是从底层读取一个默认大小为8K Reader的内部char[]缓冲区,并且所有方法都在该缓冲区上工作,直到它耗尽,此时从底层读取另一个8K(或其他)Reader.将readLine()被排序的上涨了.

正确使用BufferedReader绝对不应导致运行时间从1.8米线的40秒上升到3米线的30分钟.您的代码一定有问题.向我们展示.

另一种可能性是你的JVM没有足够的堆内存,并且花费30分钟的大部分时间来进行垃圾收集,因为它的堆已满99%并且你最终会获得OutOfMemoryError更大的输入.你对你处理过的线条做了什么?他们留在记忆中吗?使用-Xmx 1024M命令行选项运行程序会有所不同吗?