【问题标题】:Read File in chunks and then read line by line using LineNumberReader. Repeat this activity分块读取文件,然后使用 LineNumberReader 逐行读取。重复这个活动
【发布时间】:2013-09-01 05:24:29
【问题描述】:

我有一个包含大约 65 万行的文件。现在我希望使用 LineNumberReader 读取该文件的每一行。

但是,我在将这么多行添加到另一个 3rd 方库时遇到了 outofMemoryError ..

我打算做的是,一次读取 200000 行文件并将这些行添加到 3rd 方库。

我正在使用 LineNumberReader,但我认为整个文件正在被读取,尽管我提供了当行数达到 200000 时打破循环并将这些添加到 3rd 方库的条件..

相同的代码sn-p:

    LineNumberReader lnr=new LineNumberReader(new FileReader(file));
    String line=null;
    int i=0;      
    while(flags)
              {
     while( null != (line = lnr.readLine()) ){  
    i++;   
     3rdPartyLibrary.add(line.trim());
    if(i==200000)
                {      
                    System.out.println("Breaking");
                    lnr.mark(i);
                    break;
                }  
                if(i==400000)
                {
                    System.out.println("" );
                    lnr.mark(i);
                    break;
                }
                if(i==600000)
                {
                    System.out.println("BREAKING " );
                    lnr.mark(i);
                    break;
                }
     }
    if(line==null)
              {
                  System.out.println(" FLAG");
                  flags=false;
              }
lnr.reset();
    }

我打算在这里做的是在第一次迭代中从 0-200000 读取文件。然后读取每一行并添加到第 3 方库中。完成后,从 (200001-400000) 读取另外 200000 行,然后重复相同的活动。

需要帮助..有人可以指导..

【问题讨论】:

    标签: java file split buffer line-numbers


    【解决方案1】:

    据我所知,当 JVM 由于内存不足而无法分配更多对象(在您的情况下为字符串)时会出现此错误,因为您的程序已经占用了很多内存。请在循环内的某处调用 System.gc() 并检查它是否有效。

    【讨论】:

    • 我基本上想要一种方法来一次读取 200000 行并递归地执行此过程,直到读取所有行为止。我更关心这个而不是 outoFMemory 错误。
    【解决方案2】:

    这是我很久以前尝试过的示例, http://www.javacodegeeks.com/2013/01/processing-huge-files-with-java.html 这解决了内存不足异常。

    【讨论】:

    • 根据我提供的代码示例,我需要一些东西。
    • 哦!对不起,在你的情况下,这对你没有帮助。好的,正如你所说的 read 200000 lines of a file at a time and add these lines to 3rd party library. 那么在第二个 while 循环中需要 3rdPartyLibrary.add(line.trim()); 代码吗?
    • while(flags) 将始终运行,直到我到达文件末尾,在该文件末尾我检查了行是否为 null 并设置 flags=false。 add 写在第二个 for 循环中的原因是,一旦我读到一行,我就需要将它写入第 3 方库。此计数应限制为一次 200000。我的意思是我会重复这个过程,逐个读取 200000 行并添加到 lib 直到到达文件末尾...!!!
    • 好的,明白了。我运行了你的代码,没有任何错误,除了try{}finally{ lnr.close(); },所以请检查第 3 方库。你在任何地方都没有存储任何东西,没有内存泄漏。请与您的第 3 方库核对。
    • 是的..我知道最后的事情,因为我还没有写它,因为我更专注于异常.. 最好我正在检查 3rd 方库本身,看看我是否在那边做错事了。
    猜你喜欢
    • 1970-01-01
    • 2015-05-19
    • 2020-02-21
    • 1970-01-01
    • 2015-12-14
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    相关资源
    最近更新 更多