我正在使用BufferReader.readlLine()
.
两个文件大小相同,为 130MB,但处理一个需要 40 秒,而另一个需要 75 秒。
我注意到一个文件有 180 万行,而另一个文件有 210 万行。但是,当我尝试处理具有相同大小的 300 万行的文件时,需要 30 分钟来处理。
所以我的问题是:
这种行为是因为缓冲区读取器的查找时间(我想知道如何
BufferedReader
工作或逐行解析文件?)有什么方法可以更快地逐行读取文件吗?
好的朋友,我提供更多细节。
我使用正则表达式将行分成三部分,然后使用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 to -Xmx 1024M
,但无论如何它都没有帮助。
更新: 根据我的观察,当我写入缓冲区(在物理内存中)时,没有。写入缓冲区的次数正在增加,较新的写入需要时间。(这是我的猜测)
请回复。