gpt4 book ai didi

java - BufferedReader 性能低下

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:03:44 24 4
gpt4 key购买 nike

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

两个文件大小相同,均为 130MB,但处理一个文件需要 40 秒,而另一个文件需要 75 秒。

我注意到一个文件有 180 万行,而另一个文件有 210 万行。但是,当我尝试处理一个包含 300 万行且大小相同的文件时,我花了 30 分钟来处理。

所以我的问题是:

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

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

好的, friend 们,我正在提供更多细节。

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

但是所有文件的处理逻辑都是相同的,即使是一个大小为 330MB 的文件,但少于 100 万行的文件也会在 30 秒内处理。可能是什么原因?

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);

}

已将 -Xmx256M 更改为 -Xmx 1024M,但无论如何都无济于事。

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

请回复。

最佳答案

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

BufferedReader 的正确使用绝对不会导致运行时间从 1.8m 行的 40 秒增加到 3m 行的 30 分钟。你的代码一定有问题。展示给我们看。

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

关于java - BufferedReader 性能低下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7179373/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com