【问题标题】:Reading from a file, running out of memory从文件中读取,内存不足
【发布时间】:2016-01-02 18:33:58
【问题描述】:

我最近刚刚被问到一个面试问题,该问题旨在处理读取 CSV 文件并总结某些单元格中的条目。当被要求对其进行优化时,我无法回答如果给我们一个大小为 100 gigs 的 CSV,如何处理内存不足的情况。

在 Java 中,从文件中读取究竟是如何工作的?我们怎么知道什么时候太大了?我们如何处理?有人告诉我,您可以传入中间阅读器对象,而不是尝试阅读整个内容?

【问题讨论】:

  • 一次处理一行。
  • 您执行类似this 的操作,但不是附加到 StringBuilder,而是在现场进行求和计算。试图将整个输入文件存储在内存中会导致麻烦。

标签: java file csv io


【解决方案1】:

面试官给了你一个提示——BufferedReader。它是逐行读取大文件的有效选择。

小例子:

String line;
BufferedReader br = new BufferedReader("c:/test.txt");
while ((line= br.readLine()) != null) {
   //do processing
} 
br.close();

Here 是文档

【讨论】:

  • 这里不需要初始化line
【解决方案2】:

在 Java 中有多种读取文件的方法,其中一些涉及将所有文件行(或数据)保留在内存中,因为您“读取”由换行符等分隔的数据(逐行读取)例如)。

对于大文件,您希望使用 Scannerclass 一次处理较小的位(或类似的东西一次读取特定字节)。

示例代码:

FileInputStream inputStream = new FileInputStream(path);
Scanner sc = new Scanner(inputStream, "UTF-8");
while (sc.hasNextLine()) {
   String line = sc.nextLine();
   // System.out.println(line);
}

【讨论】:

    【解决方案3】:

    您可以使用RandomAccessFile 来读取文件。不过,这可能不是最好的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 2012-11-05
      • 2011-09-18
      • 2014-01-26
      • 2014-07-22
      • 2013-10-06
      相关资源
      最近更新 更多