【问题标题】:java code to extract section of text from huge file, using only min RAMjava代码从大文件中提取文本部分,仅使用最小RAM
【发布时间】:2013-01-12 10:31:50
【问题描述】:

我有巨大的文本文件——每个文件有 10 GB 大。

现在,我有 2 个字符串 "StringNumber1""StringNumber2"

“Stringnumber1”在每个文本文件中只出现一次,"StringNumber2" 总是在"StringNumber1" 之后(尽管在文本文件中"StringNumber2" 可能出现不止1 次)。

我想提取每个文件中出现的所有文本,从“StringNumber1”的匹配开始,直到匹配“StringNumber1”之后立即出现的"StringNumber2"(@987654327 这些出现之间的内容@ 和 "StringNumber2" 可能是几字节到几千兆字节)...

如何使用最少的 RAM 提取此类内容?我想在 Java 中做到这一点。

【问题讨论】:

  • 看起来像是正则表达式的工作 - 但您需要向它们提供流。
  • 仅仅使用BufferedReader 还不够好吗?
  • 您尝试过什么,遇到过什么困难?您是否知道自己有记忆问题,或者您担心自己可能有记忆问题?

标签: java file text file-io


【解决方案1】:

仅仅使用BufferedReader 还不够好吗?好吧,我从来没有遇到过读取非常大的文件的问题。使用此方法时是否遇到某种错误?

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Read {

    /**
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader("someFile"));
        try {
            String line = br.readLine();
            while (line != null) {
                if(line.contains("String 1")) {
                    // ...
                } else if (line.contains("String 2")) {
                    // ...
                }               
                line = br.readLine();
            }       
        } finally {
            br.close();
        }
    }
}

【讨论】:

  • 我会把循环写成for(String line; (line = br.readline()) != null;)
【解决方案2】:

要尽量减少 RAM 使用量,请将数据复制到另一个文件。当你看到第一个字符串时开始一个新文件,当你看到第二个字符串时停止。这意味着您的堆使用量很小(几 MB)并且是恒定的(无论复制的数据量如何)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    • 2017-09-20
    • 2014-12-07
    • 2011-01-05
    • 1970-01-01
    相关资源
    最近更新 更多