开发者社区> 问答> 正文

java io读取大文件操作:报错

io流处理文件   逐行读取    测试文件达到200M时报

展开
收起
kun坤 2020-06-07 16:22:18 715 0
1 条回答
写回答
取消 提交回答
  • 如果说读一行处理一行的话,用BufferedReader的readLine是不会报OOM的,除非你读完每行数据又保存在内存里? 贴上代码看看吧。。######@丨丨丨 可现在如果要写入,也是要先能读取的,对吧。现在是文件大小上到200M就直接读不了######@丨丨丨 是的,我每行进来后只取三个字段然后放入list。内存早已在异常最初处理就加了######回复 @八月长安 : 指导谈不上,看样子msg应该是个List,这样无限放下去肯定会OOM的。根据业务能不能在msg里面的数据到达一定数量之后,就写到文件或者写到数据库,分批处理。实在不行就-Xmx适当加大点内存,-Xmx1024m,要改至少能处理个几百m的文件######代码已帖 如有这方面经验 请指导######BufferedReader不适合读写几百兆的文件,按理说设置好BufferedReader的缓存大小按行读取不会出现内存溢出,但是当读写到几万行设置更大的时候就会出内存溢出。可能跟readLine的巨量String操作引起内存泄露GC来不及回收。要么试着把JVM内存参数调大一点,更好的方法是用字节读写或者用NIO操作吧。网上应该有蛮多例子的。######回复 @八月长安 : http://www.oschina.net/code/snippet_54100_7938?p=1#comments看这个可以不######字节流一开始就是看文件过大而放弃使用######NIO我没接触过,早上也尝试着去用,但恕我愚钝,并未能写出demo,你方便给我一个,如果你用过的话######

    引用来自“丨丨丨”的评论

    如果说读一行处理一行的话,用BufferedReader的readLine是不会报OOM的,除非你读完每行数据又保存在内存里? 贴上代码看看吧。。

    @八月长安 : 光读取不可能是OOM的,下面这个代码读取几个G的文件都没问题。 所以原因还是msg的List放的东西太多了,读200M内存就满了,如果需要跟踪内存变化可以加参数-XX:+PrintGCDetails

    public static void main(String[] args) throws Exception {
            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("e:\\TEST.20150528150817776")));
            int count = 0;
            for (String line = br.readLine(); line != null; line = br.readLine()) {
                count++;
                if (count % 10000 == 0) {
                    System.out.printf("read line count: %d%n", count);
                }
            }
            System.out.printf("read line count: %d%n", count);
            br.close();
        }



     
    ######试试 java . nio .MappedByteBuffer,这个虚拟内存映射的IO,性能好,而且适合大文件.######恩,我现在就是尝试着去写NIO流######用Spring Batch很容易处理大文件,我处理过10G的文件######我也没用过Spring batch。。。。也会去查看有关资料的,谢谢######嗯,谢谢各位了,我在用NIO在尝试着去写了
    2020-06-07 16:22:23
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载