0

巨大なテキスト ファイルがあります。各ファイルは 10 GB にもなります。

今、私は2本の弦を持っています"StringNumber1""StringNumber2"

"Stringnumber1" は、各テキスト ファイルで 1 回だけ発生し、"StringNumber2"常にその後に"StringNumber1"あります (ただし、テキスト ファイルには複数回発生する可能性があり"StringNumber2"ます)。

"StringNumber2"「StringNumber1」の一致から始まり、一致する「StringNumber1」の直後に発生するまで、各ファイルに発生するすべてのテキストを抽出したい(これらの発生"StringNumber1"との間のコンテンツは"StringNumber2"、数バイトから数ギガバイトになる場合があります) )...

最小限の RAM を使用して、そのようなコンテンツを抽出するにはどうすればよいですか? Javaでこれをやりたいです。

4

2 に答える 2

1

RAMの使用量を最小限に抑えるには、データを別のファイルにコピーします。最初の文字列が表示されたら新しいファイルを開始し、2番目の文字列が表示されたら停止します。これは、ヒープの使用量が少なく(数MB)、一定である(コピーされるデータの量に関係なく)ことを意味します

于 2013-01-12T10:34:51.780 に答える
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();
        }
    }
}
于 2013-01-12T10:45:30.533 に答える