2011-08-24 92 views
6

我正在使用BufferReader.readlLine()逐行处理大量文本文件。BufferedReader性能低下

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

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

所以我的问题是:

  1. 这种行为是因为寻求缓冲读者的时间(我想知道如何BufferedReader作品或线分析文件行?)

  2. 有我可以用更快的方式逐行读取文件的任何方式?

好的朋友,我提供了一些更多的细节。我使用正则表达式将行分成三部分,然后使用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但不反正帮助。根据我的观察,当我正在写入缓冲区(在物理内存中)时,作为第一个物理内存。写入缓冲区的次数越来越多,新的写入需要时间。 (这是我的猜测)

请回复。

+3

请张贴您使用BufferReader的代码 – razlebe

+1

也许它不必与BufferedReader一起使用,而是使用每行处理。 – Marcelo

回答

6

唯一BufferedReader没有从根本Reader读入内部char[]缓冲区8K的默认大小,所有的方法对缓冲区的工作,直到它已经用尽了,此时从底层的Reader中读取了另外的8K(或其他)。 readLine()是加固。

正确使用BufferedReader肯定应该是而不是导致运行时间从1.8m线上的40秒上升到3m线上的30分钟。你的代码一定有问题。显示给我们。

另一种可能性是您的JVM没有足够的堆内存,并且30分钟内大部分时间都在进行垃圾回收,因为它的堆已满99%,并且最终会得到一个输入较大的OutOfMemoryError。你在处理的线条上做什么?他们是否在记忆中?使用-Xmx 1024M命令行选项运行程序是否有所作为?

+0

嘿谢谢...提供了一些关于我的问题的更多细节请通过 – samarth

+0

@samarth:我没有看到你发布的代码有什么问题。最简单的解决方案可能是用VisualVM做一些简单的分析。这应该告诉你所有的时间都花在哪里,这可能会直接导致你直接导致问题的原因。 –

1

BufferedReader不会寻找,它只是缓存字符,直到找到换行符并将该行作为字符串返回,并在每行之后丢弃(重新使用)缓冲区。这就是为什么你可以使用它与任何流或其他读者,即使那些不支持寻求。

因此,单独行数不应该在读者级别造成如此大的差异。然而,很长的一行可能会创建一个非常大的字符串并分配大量的RAM,但这似乎不是您的情况(在这种情况下,它可能会因GC时间过长或类似情况而导致OutOfMemory异常)。

对于我在代码中可以看到的内容,您没有做错任何事情。我想你正在碰到某种限制,因为它似乎不是RAM,也许它与Cassandra方面的一些硬性限制有关?你有没有试过评论Cassandra上写的部分?只是为了看看是你的身边还是Cassandra身边造成的问题。

+0

嘿谢谢...提供了一些关于我的问题的更多细节,请通过 – samarth

+0

查看你的代码后编辑答案。 –

1

BufferedReader可能不是您的性能问题的根源。

根据您引用的数字,听起来您的代码中存在一些二次复杂性。例如,对于您阅读的每一行,您都重新检查您之前阅读过的每一行。我只是在这里进行推测,但这个问题的一个常见例子是使用列表数据结构,并检查新行是否与之前的行匹配。

+0

嘿谢谢...提供了一些关于我的问题的更多细节请通过 – samarth