精华内容
下载资源
问答
  • 下面小编就为大家带来一篇完美解决java读取大文件内存溢出的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 解决java读取大文件内存溢出的问题

    千次阅读 2019-12-20 11:16:57
    1. 传统方式:在内存中读取文件内容 读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法: ? 1 2 Files.readLines(new File(path), ...

    1. 传统方式:在内存中读取文件内容

    读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法:

    ?

    1

    2

    Files.readLines(new File(path), Charsets.UTF_8);

    FileUtils.readLines(new File(path));

    实际上是使用BufferedReader或者其子类LineNumberReader来读取的。

    传统方式的问题: 是文件的所有行都被存放在内存中,当文件足够大时很快就会导致程序抛出OutOfMemoryError 异常。

    问题思考:我们通常不需要把文件的所有行一次性地放入内存中,相反,我们只需要遍历文件的每一行,然后做相应的处理,处理完之后把它扔掉。所以我们可 以通过行迭代方式来读取,而不是把所有行都放在内存中。

    2. 大文件读取处理方式

    不重复读取与不耗尽内存的情况下处理大文件:

    (1)文件流方式:使用java.util.Scanner类扫描文件的内容,一行一行连续地读取

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    FileInputStream inputStream = null;

    Scanner sc = null;

    try {

     inputStream = new FileInputStream(path);

     sc = new Scanner(inputStream, UTF-8);

     while (sc.hasNextLine()) {

      String line = sc.nextLine();

      // System.out.println(line);

      }

    }catch(IOException e){

      logger.error(e);

    }finally {

      if (inputStream != null) {

      inputStream.close();

      }

      if (sc != null) {

        sc.close();

       }

    }

    该方案将会遍历文件中的所有行,允许对每一行进行处理,而不保持对它的引用。总之没有把它们存放在内存中!

    (2)Apache Commons IO流:使用Commons IO库实现,利用该库提供的自定义LineIterator

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    LineIterator it = FileUtils.lineIterator(theFile, UTF-8);

    try {

     while (it.hasNext()) {

     String line = it.nextLine();

     // do something with line

      }

    } finally {

     LineIterator.closeQuietly(it);

    }

     该方案由于整个文件不是全部存放在内存中,这也就导致相当保守的内存消耗。

    展开全文
  • 解决java读取大文件内存溢出问题

    千次阅读 2017-08-09 17:59:00
    1. 传统方式:在内存中读取文件内容  读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法: Files.readLines(new File(path), Charsets.UTF_8); FileUtils....

    1. 传统方式:在内存中读取文件内容

     读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法:
       Files.readLines(new File(path), Charsets.UTF_8);
       FileUtils.readLines(new File(path));
       实际上是使用BufferedReader或者其子类LineNumberReader来读取的。
      传统方式的问题: 是文件的所有行都被存放在内存中,当文件足够大时很快就会导致程序抛出OutOfMemoryError 异常。

      问题思考:我们通常不需要把文件的所有行一次性地放入内存中,相反,我们只需要遍历文件的每一行,然后做相应的处理,处理完之后把它扔掉。所以我们可 以通过行迭代方式来读取,而不是把所有行都放在内存中。

    2. 大文件读取处理方式

      不重复读取与不耗尽内存的情况下处理大文件:

       (1)文件流方式:使用java.util.Scanner类扫描文件的内容,一行一行连续地读取

    FileInputStream inputStream = null; 
    Scanner sc = null; 
    try { 
        inputStream = new FileInputStream(path); 
        sc = new Scanner(inputStream, UTF-8); 
        while (sc.hasNextLine()) {
            String line = sc.nextLine(); 
            // System.out.println(line); 
         } 
    }catch(IOException e){
           logger.error(e);
    }finally {
         if (inputStream != null) { 
            inputStream.close(); 
         } 
         if (sc != null) {
                 sc.close();
             }
    }            
    View Code

      该方案将会遍历文件中的所有行,允许对每一行进行处理,而不保持对它的引用。总之没有把它们存放在内存中

       (2)Apache Commons IO流:使用Commons IO库实现,利用该库提供的自定义LineIterator

    LineIterator it = FileUtils.lineIterator(theFile, UTF-8); 
    try {
        while (it.hasNext()) {
        String line = it.nextLine(); 
        // do something with line 
         } 
    } finally {
       LineIterator.closeQuietly(it);
    }
    View Code

          该方案由于整个文件不是全部存放在内存中,这也就导致相当保守的内存消耗。

     

          

    展开全文
  • 解决java读取大文件内存溢出问题、如何在不重复读取与不耗尽内存的情况下处理文件 标签: java文件流Apache Commons IO流 2015-11-19 15:50 5197人阅读 评论(3) 举报  分类: JAVA(44) ...

    解决java读取大文件内存溢出问题、如何在不重复读取与不耗尽内存的情况下处理大文件

    标签: java文件流Apache Commons IO流
      5197人阅读  评论(3)  举报
      分类:
     

    目录(?)[+]

    1、传统的在内存中读取

    读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法:

    1
    2
    3
    Files.readLines( new File(path), Charsets.UTF_8);
     
    FileUtils.readLines( new File(path));

    这种方法带来的问题是文件的所有行都被存放在内存中,当文件足够大时很快就会导致程序抛出OutOfMemoryError 异常。

    例如:读取一个大约1G的文件:

    1
    2
    3
    4
    5
    @Test
    public void givenUsingGuava_whenIteratingAFile_thenWorks() throws IOException {
         String path = ...
         Files.readLines( new File(path), Charsets.UTF_8);
    }

    这种方式开始时只占用很少的内存:(大约消耗了0Mb内存)

    1
    2
    [main] INFO  org.baeldung.java.CoreJavaIoUnitTest - Total Memory: 128 Mb
    [main] INFO  org.baeldung.java.CoreJavaIoUnitTest - Free Memory: 116 Mb

    然而,当文件全部读到内存中后,我们最后可以看到(大约消耗了2GB内存)

    1
    2
    [main] INFO  org.baeldung.java.CoreJavaIoUnitTest - Total Memory: 2666 Mb
    [main] INFO  org.baeldung.java.CoreJavaIoUnitTest - Free Memory: 490 Mb

    这意味这一过程大约耗费了2.1GB的内存——原因很简单:现在文件的所有行都被存储在内存中。

    把文件所有的内容都放在内存中很快会耗尽可用内存——不论实际可用内存有多大,这点是显而易见的。

    此外,我们通常不需要把文件的所有行一次性地放入内存中——相反,我们只需要遍历文件的每一行,然后做相应的处理,处理完之后把它扔掉。所以,这正是我们将要做的——通过行迭代,而不是把所有行都放在内存中。

    2、文件流

    现在让我们看下这种解决方案——我们将使用Java.util.Scanner类扫描文件的内容,一行一行连续地读取:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    FileInputStream inputStream = null ;
    Scanner sc = null ;
    try {
         inputStream = new FileInputStream(path);
         sc = new Scanner(inputStream, "UTF-8" );
         while (sc.hasNextLine()) {
             String line = sc.nextLine();
             // System.out.println(line);
         }
         // note that Scanner suppresses exceptions
         if (sc.ioException() != null ) {
             throw sc.ioException();
         }
    } finally {
         if (inputStream != null ) {
             inputStream.close();
         }
         if (sc != null ) {
             sc.close();
         }
    }

    这种方案将会遍历文件中的所有行——允许对每一行进行处理,而不保持对它的引用。总之没有把它们存放在内存中(大约消耗了150MB内存)

    1
    2
    [main] INFO  org.baeldung.java.CoreJavaIoUnitTest - Total Memory: 763 Mb
    [main] INFO  org.baeldung.java.CoreJavaIoUnitTest - Free Memory: 605 Mb

    3、Apache Commons IO流

    同样也可以使用Commons IO库实现,利用该库提供的自定义LineIterator:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    LineIterator it = FileUtils.lineIterator(theFile, "UTF-8" );
    try {
         while (it.hasNext()) {
             String line = it.nextLine();
             // do something with line
         }
    } finally {
         LineIterator.closeQuietly(it);
    }

    由于整个文件不是全部存放在内存中,这也就导致相当保守的内存消耗:(大约消耗了150MB内存)

    1
    2
    [main] INFO  o.b.java.CoreJavaIoIntegrationTest - Total Memory: 752 Mb
    [main] INFO  o.b.java.CoreJavaIoIntegrationTest - Free Memory: 564 Mb

    4、结论

    这篇短文介绍了如何在不重复读取与不耗尽内存的情况下处理大文件——这为大文件的处理提供了一个有用的解决办法。

    展开全文
  • java 大文件excel 内存溢出 解决

    千次阅读 2017-05-25 13:27:31
    POI官方推荐解决内存溢出的方式使用CVS格式解析,我们不可能手工将Excel文件转换成CVS格式再上传,这样做太麻烦了,好再POI给出了xlsx转换CVS的例子,基于这个例子我进行了一下改造,即可解决用户模式读取Excel内存...

     

        Office软件一直是一个诲誉参半的软件,广大普通计算机用户用Office来满足日常办公需求,于是就产生了很多生产数据和文档,需要和企业单位的专用办公系统对接,而Office的解析工作一直是程序员非常头痛的问题,经常招致程序员的谩骂,也被誉为是微软最烂的发明之一。POI的诞生解决了Excel的解析难题(POI即“讨厌的电子表格”,确实很讨厌,我也很讨厌Excel),但如果用不好POI,也会导致程序出现一些BUG,例如内存溢出,假空行,公式等等问题。下面介绍一种解决POI读取Excel内存溢出的问题。

            POI读取Excel有两种模式,一种是用户模式,一种是SAX模式,将xlsx格式的文档转换成CVS格式后再进行处理用户模式相信大家都很清楚,也是POI常用的方式,用户模式API接口丰富,我们可以很容易的使用POI的API读取Excel,但用户模式消耗的内存很大,当遇到很多sheet、大数据网格、假空行、公式等问题时,很容易导致内存溢出。POI官方推荐解决内存溢出的方式使用CVS格式解析,我们不可能手工将Excel文件转换成CVS格式再上传,这样做太麻烦了,好再POI给出了xlsx转换CVS的例子,基于这个例子我进行了一下改造,即可解决用户模式读取Excel内存溢出的问题。下面附上代码:

     

    maven

     

    <!-- poi office -->
    		<dependency>
    			<groupId&g
    展开全文
  • java文件上传内存溢出

    2020-12-15 14:28:46
    java -jar -server -Xms2g -Xmx2g java ${JVM_OPTS} -jar jar/diageo-background.jar --spring.profiles.active=prod $SPRING_OPTS > diageobi.log 2>&1 & java $JVM_OPTS -jar -server -Xms2g -...
  • 深入理解Java虚拟机-Java内存区域与内存溢出异常

    万次阅读 多人点赞 2020-01-03 21:42:24
    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却想出来。 文章目录概述运行时数据区域程序计数器(线程私有)Java虚拟机栈(线程私有)局部变量表操作数栈动态链接...
  • 完美解决java读取excel内存溢出问题,希望可以帮到大家
  • Java内存区域与内存溢出异常 1.概述 对于 Java 的开发者来说,在虚拟机的自动内存管理机制的帮助下,不再需要为每一个 new 操作去写配对的 delete/ free 代码,这样不容易出现内存泄露和内存溢出的问题,只要...
  • 当时在做分片时,当分片容量大于512M时,内存溢出,抛出异常:java.lang.OutOfMemoryError: Java heap space。 分析一下:当时虚拟机堆内存正好设置为512M,当申请堆空间大于该值时出现如上异常。 今日重写代码...
  • Java内存区域与内存溢出

    千次阅读 2020-02-09 17:27:55
    Java与C语言针对“内存管理”有很的不同。 在C语言中,开发者需要维护对象的出生和死亡,往往需要为每个new出来的对象编写配套的delete/free代码来释放内存,否则可能发生内存泄漏或溢出。 而在Java中,内存由JVM...
  • 首先在这里记录一个问题 在eclipse中同一个项目下即使...内存溢出问题: 错误信息:java.lang.OutOfMemoryError JVM内存过小、程序不严密,产生了过多的垃圾。导致的问题。想要快速解决的方法改不了程序就需要修改t
  • Java 解决堆内存溢出

    2021-05-06 17:05:39
    文章目录目录实战-内存溢出实战-堆内存溢出内存溢出演示代码Eclipse Memory Analyzer 分析流程jvisualvm.exe 分析堆内存溢出内存溢出的场景商城项目可能存在堆内存溢出的方法 目录 实战-内存溢出内存溢出 栈...
  • Java内存结构与内存溢出

    千次阅读 2020-07-02 22:10:16
    也正在因为这个区别,JAVA在虚拟机自动内存管理的帮助下,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样分配、回收内存的,在问题排查上会是一份艰难的工作。 Java虚拟机在执行Java程序时会把所管理...
  • 文章目录Java-排查内存泄漏内存溢出和内存泄露内存溢出产生原因:发生场景此错误常见的错误提示:解决方法内存泄露内存溢出和内存泄露的联系 内存溢出和内存泄露 内存溢出:程序所写入数据的空间大于所申请的空间,...
  • Java内存区域与内存溢出异常 Java与C++之间有一堵由内存动态分配和垃圾收集技术围城的"高墙",墙外的人想进去,墙里的人却想出来 概述 对于C、C++程序开发人员来说,在内存管理领域,既拥有每个对象的"所有权",又...
  • java内存区域与内存溢出

    千次阅读 2017-02-24 16:27:56
     Java虚拟机在执行java程序的过程中把他所管理的内存划分为若干个不同的数据区域。包括:程序计数器、java虚拟机栈、本地发放栈、java堆、方法区。 内存模型如图:  程序计数器 一块较小的内存空间...
  • JVM:自动内存管理之Java内存区域与内存溢出

    千次阅读 多人点赞 2021-01-07 12:03:22
    一、Java内存区域与内存溢出异常 1、运行时数据区域 运行时数据分为七块 先来看看JVM内存分布图 1、程序计数器 程序计数器是一个记录着当前线程所执行的字节码的行号指示器。 Java虚拟机中每条线程都有...
  • 有时候在极端情况下,需要在Assets里头放置特别文件,有可能达到上G。这个时候我们调用Assets.open 来打开这个文件有...过文件致使内存溢出。 这个时候我们可以考虑使用 context.getClass().getClassLo...
  • Java上传数据内存溢出

    2016-01-01 07:12:29
    银行的系统,上传一个文件给其他系统,由于数据量太,报内存溢出,急求。
  • Java内存溢出

    2017-11-09 18:08:52
    Tomcat本身不能直接在计算机上运行,需要依赖于操作系统和一个JAVA虚拟机。...一、常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError: Java heap space 即JVM Heap溢出 解释说明:J
  • 引入依赖 <dependency> <groupId>com.monitorjbl</groupId> <artifactId>xlsx-streamer</artifactId>... //path为文件路径 获取文件 InputStream stream = new Fil
  • java排查内存溢出

    2019-12-30 19:21:42
    1.1:什么是内存溢出,为什么会内存溢出? 2排查问题: Overview视图 histogram视图(重要) Dominator Tree(重要) 3问题复现: 4解决问题: 5总结: 1背景: 最近公司线上项目出现了java.lang....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 109,196
精华内容 43,678
关键字:

java读大文件内存溢出

java 订阅