首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不重新实例化Bufferedreader的情况下回到文件的第一行?

如何在不重新实例化Bufferedreader的情况下回到文件的第一行?
EN

Stack Overflow用户
提问于 2011-12-30 01:42:29
回答 3查看 4.3K关注 0票数 1
代码语言:javascript
复制
        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)有没有办法创建一次读取器,每当它到达最后一行,在下一次迭代中,它将从头开始...

正如我所说的,文件可能非常大,因此,我不想将其缓存到内存中。

有什么建议/意见吗?

提前谢谢。

EN

回答 3

Stack Overflow用户

发布于 2011-12-30 02:10:24

与重新读取整个“非常大”文件的成本相比,为每一列创建一个新的BufferedReader的成本可以忽略不计。

每当你担心性能的时候,你应该采取的第一步是测量。您当前的实现是否真的比您希望的要慢?如果它看起来足够快,那就别管它了。

如果结果表明它比您希望的要慢,那么“优化”的最好方法是读取文件一次,而不是为您关心的每一列读取一次。您可以将列名的Map转换为"column processors“,而不是采用单个列名。每个“列处理器”将被赋予其列的连续值,并计算它应该计算的任何值(例如:和、平均值、平方和,甚至只是将值存储在集合中)。

票数 1
EN

Stack Overflow用户

发布于 2011-12-30 01:55:29

应该不是问题。默认情况下,BufferedReader只缓存最多4096字节的文件。因此,与尝试扫描回到文件开头相比,创建新的BufferedReader所需的资源是最少的。

您正在使用的行为似乎会扫描每一列的整个文件。如果您遇到了性能问题,那么这很可能是问题的根源(而不是创建新的BufferedReaders)。尝试确定文件的标题是什么(即,您需要多少列),然后逐行处理数据,而不是逐列处理。

如果你真的,真的想在文件中的任何地方寻找,那么试着看看RandomAccessFile

票数 0
EN

Stack Overflow用户

发布于 2011-12-30 02:02:24

哦,天哪。你的问题将是这个算法的性能。您实际上是在一个非常大的数据集上编写一个O(N^2)算法。无论如何,它都不会有很好的表现。您需要找出一种可能将部分数据存储在内存中的方法,或者使用某种可以使用的汇总指标,而不是重新扫描刚刚扫描的所有内容。

但是,无论如何,如果底层的Readers/InputStream支持它,您可以使用java.io.Reader.reset()返回文件的开头。FileReader通常是这样的。孩子,请自便。你会把眼睛打出来的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8671262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档