【问题标题】:java heap space error while writing to a file写入文件时出现java堆空间错误
【发布时间】:2017-10-18 11:15:49
【问题描述】:

我正在尝试一次将大约 64000 条记录的大量数据写入文件。我收到了我在下面附加的例外情况。

我以前写的代码是

Path outputpath = Paths.get("file1.json");
try (BufferedWriter writer = Files.newBufferedWriter(outputpath, StandardCharsets.UTF_8, WRITE)) {
 writer.write(jsonObject.toString());
} catch (Exception e) {
//error msg
}

这里我的“jsonObject”不过是一个包含 65000 行的 json 数组。

你能帮我以一种有效的方式将它写入我的文件,这样我就可以避免堆空间错误

【问题讨论】:

  • 不要在内存中创建 JSON 表示,将其流式传输到 writer
  • 您可以尝试使用该解决方案:stackoverflow.com/questions/1062113/…
  • 启动JVM时给它更多内存,看看-Xmx命令行选项。或者尝试像 MleRutte 建议的那样进行流式传输

标签: java arrays bufferedwriter


【解决方案1】:

您已经将堆栈跟踪缩短了一点,但我假设异常发生在 jsonObject.toString() 中。

基本上,您必须在两件事之间做出决定:要么分配更多内存,要么将大操作分成几个较小的操作。添加内存既快速又简单,但如果您期望将来有更多数据,它不会永远解决您的问题。正如其他人所提到的,在 java 命令行上使用 -Xmx 和/或 -Xms。

接下来您可以尝试使用不同的 JSON 库。也许您现在使用的那个不是特别适合大型 JSON 对象。或者可能会有更新的版本。

作为最后的手段,您始终可以自己构建 JSON。毕竟它是一个字符串,并且您已经在内存中拥有数据。为了尽可能高效,您甚至不需要一次构建整个字符串,您可以继续往 BufferedWriter 中写入零碎的内容。

【讨论】:

    【解决方案2】:

    你可以尝试通过你的json对象iterate

    Iterator<String> keys = (Iterator<String>) jsonObject.keys();
    while (keys.hasNext()) {
        String key = keys.next();
        JSONObject value = jsonObject.getJSONObject(key);
        writer.write(value.toString());
    }
    

    PS。您需要检查您的 json 对象的结构。

    【讨论】:

      猜你喜欢
      • 2013-06-28
      • 2016-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-01
      相关资源
      最近更新 更多