0

私がやっていることは、ファイルを 1 行ずつ読み取り、すべての行をフォーマットしてから、新しいファイルに書き込むことです。しかし問題は、ファイルが巨大で、ほぼ 178 MB であることです。 しかし、常にエラーメッセージが表示されます: IO console updater error, Java heap space. これが私のコードです:

public class fileFormat {
    public static void main(String[] args) throws IOException{

        String strLine;

        FileInputStream fstream = new FileInputStream("train_final.txt");
        BufferedReader reader = new BufferedReader(new InputStreamReader(fstream));
        BufferedWriter writer = new BufferedWriter(new FileWriter("newOUTPUT.txt"));

        while((strLine = reader.readLine()) != null){
            List<String> numberBox = new ArrayList<String>();
            StringTokenizer st = new StringTokenizer(strLine);
            while(st.hasMoreTokens()){
                numberBox.add(st.nextToken());
            }
            for (int i=1; i< numberBox.size(); i++){
                String head = numberBox.get(0);
                String tail = numberBox.get(i);
                String line = head + "  "+tail ;
                System.out.println(line);
                writer.write(line);
                writer.newLine();
            }
            numberBox.clear();
        }
        reader.close();
        writer.close();
    }
}

このエラー メッセージを回避するにはどうすればよいですか? さらに、VM プリファレンスを設定しました: -xms1024m

4

4 に答える 4

3

線を取り除く

System.out.println(line);

これは、メモリ不足になるコンソール アップデーターの回避策です。

于 2013-09-05T07:45:43.793 に答える
0

プログラムは問題ないようです。これを Eclipse 内で実行すると、System.out が Eclipse によってメモリ内に収集される (そのコンソール ウィンドウに表示される) ことが問題であると思われます。

 System.out.println(line);

Eclipse の外部で実行するか、Eclipse の設定を変更して System.out をどこかにパイプするか、行を削除してください。

于 2013-09-05T07:45:45.430 に答える
0

コードのこの部分:

       for (int i=1; i< numberBox.size(); i++){
            String head = numberBox.get(0);
            String tail = numberBox.get(i);
            String line = head + "  "+tail ;
            System.out.println(line);
            writer.write(line);
            writer.newLine();
       }

次のように翻訳できます。

       String head = numberBox.get(0);
       for (int i=1; i< numberBox.size(); i++){
            String tail = numberBox.get(i);
            System.out.print(head);
            System.out.print(" ");
            System.out.println(tail);
            writer.write(head);
            writer.write(" ");
            writer.write(tail);
            writer.newLine();
       }

これにより、コードの重複が少し増える可能性がありますが、多くのオブジェクトの作成を回避できます。

また、この for ループを numberBox を構成するループとマージすると、numberBox 構造はまったく必要なくなります。

于 2013-09-05T07:58:36.380 に答える