for(String column: columnHeaders){
loadFile(); // Here BufferedReader gets instantiated
String header =getLineReader().readLine();
if(header!=null)
{
while (( line=getLineReader().readLine())!=null )
{
cellValue =StatUtils.getCellValue(line,getColumnNumberByName(column));
csvColumn.addRowElement(cellValue,null);
}
}
closeStreams(); // closing the Reader
}对于每一列,我需要从第一列到最后一列读取csv文件。文本文件可以非常大(100列和5000000行)。
现在,为每列创建一个BufferedReader实例- 1)这会影响性能吗? 2)有没有办法创建一次读取器,每当它到达最后一行,在下一次迭代中,它将从头开始...
正如我所说的,文件可能非常大,因此,我不想将其缓存到内存中。
有什么建议/意见吗?
提前谢谢。
发布于 2011-12-30 02:10:24
与重新读取整个“非常大”文件的成本相比,为每一列创建一个新的BufferedReader的成本可以忽略不计。
每当你担心性能的时候,你应该采取的第一步是测量。您当前的实现是否真的比您希望的要慢?如果它看起来足够快,那就别管它了。
如果结果表明它比您希望的要慢,那么“优化”的最好方法是读取文件一次,而不是为您关心的每一列读取一次。您可以将列名的Map转换为"column processors“,而不是采用单个列名。每个“列处理器”将被赋予其列的连续值,并计算它应该计算的任何值(例如:和、平均值、平方和,甚至只是将值存储在集合中)。
发布于 2011-12-30 01:55:29
应该不是问题。默认情况下,BufferedReader只缓存最多4096字节的文件。因此,与尝试扫描回到文件开头相比,创建新的BufferedReader所需的资源是最少的。
您正在使用的行为似乎会扫描每一列的整个文件。如果您遇到了性能问题,那么这很可能是问题的根源(而不是创建新的BufferedReaders)。尝试确定文件的标题是什么(即,您需要多少列),然后逐行处理数据,而不是逐列处理。
如果你真的,真的想在文件中的任何地方寻找,那么试着看看RandomAccessFile。
发布于 2011-12-30 02:02:24
哦,天哪。你的问题将是这个算法的性能。您实际上是在一个非常大的数据集上编写一个O(N^2)算法。无论如何,它都不会有很好的表现。您需要找出一种可能将部分数据存储在内存中的方法,或者使用某种可以使用的汇总指标,而不是重新扫描刚刚扫描的所有内容。
但是,无论如何,如果底层的Readers/InputStream支持它,您可以使用java.io.Reader.reset()返回文件的开头。FileReader通常是这样的。孩子,请自便。你会把眼睛打出来的。
https://stackoverflow.com/questions/8671262
复制相似问题