0

我正在编写一个 Java 应用程序,它读取逗号分隔的文本文件,对数据执行一些计算并将更新的数据写入新文件。输入文件包含大约 5 亿行,所以我试图尽可能地缩放下面的内容,以便在运行它时不会出现内存不足的异常。关于如何改进以下内容的任何想法?

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;


public class CsvTest {

  public void readFile() {

    BufferedReader br = null;
    BufferedWriter out = null;

    try {

      br = new BufferedReader(new FileReader("C:\\input.txt"));
      FileWriter fstream = new FileWriter("C:\\output.txt");
      out = new BufferedWriter(fstream);

      String line = null;

      while ((line = br.readLine()) != null) {
        out.write(line + "\r\n");
      }
    }
    catch (FileNotFoundException ex) {
        System.err.println("Error: " + ex.getMessage());
    }
    catch (IOException ex) {
        System.err.println("Error: " + ex.getMessage());
    }
    finally {
      try {
        if (br != null) {
            br.close();
        }
        if(out != null){
            out.close();
        }
      }
      catch (IOException ex) {
          System.err.println("Error: " + ex.getMessage());
      }
    }
  }

  public static void main(String[] args) {
    CsvTest test = new CsvTest();
    test.readFile();
  }
}
4

3 回答 3

1

您应该考虑使用java.nio.channels.FileChannel。还有标准 java.io 和 java.nio 的比较,例如这样。NIO 似乎是进行大规模 I/O 操作的方式。

于 2012-11-30T22:06:35.617 回答
1
    out.write(line + "\r\n");

可以去

    out.write(line);
    out.write("\r\n");

如果您处理具有相同对象值的单元格,例如字符串,最好不要将相同的值保存为多个对象实例。

private Map<Object, Object> sharedMap = new HashMap<Object, Object>();

public Object uniqueObject(Object value) {
    Object sharedValue = sharedMap.get(value);
    if (sharedValue == null) {
        sharedValue = value;
        sharedMap.put(sharedValue, sharedValue);
    }
    return sharedValue;
}
于 2012-11-30T22:29:05.480 回答
1

您的代码非常好,我的意思是您将数据从输入流式传输到输出中,内存中只有一行,所以就内存要求而言,它基本上是 O(1),你不能比我认为的更好。

缓冲读取器和缓冲写入器中的缓冲区是恒定的,相对于多 GB 文件的大小和内存使用量而言可以忽略不计。

编辑:垃圾收集器应该可以很好地收集未使用的数据,至少我在类似的数据处理案例中的经验是非常积极的。

于 2012-11-30T22:15:25.430 回答