java代码从巨大的文件中提取文本的一部分,只使用最小的RAM

时间:2013-01-12 10:31:51

标签: java file text file-io

我有大量的文本文件 - 每个文件都大到10 GB。

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

“Stringnumber1”在每个文本文件中只出现一次,"StringNumber2"始终在"StringNumber1"之后(尽管文本文件中可能出现多次"StringNumber2")。< / p>

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

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

2 个答案:

答案 0 :(得分:1)

要最小化RAM使用率,请将数据复制到另一个文件。当您看到第一个字符串时开始一个新文件,当您看到第二个字符串时停止。这意味着您的堆使用量很小(几MB)和常量(无论复制的数据量是多少)

答案 1 :(得分:1)

仅使用BufferedReader还不够好吗?好吧,我从来没有读过真正大文件的问题。使用此approch时会出现某种错误吗?

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();
        }
    }
}