【问题标题】:FATAL ERROR: JS Allocation Failed - process out of memory致命错误:JS 分配失败 - 进程内存不足
【发布时间】:2014-01-10 15:19:10
【问题描述】:

我正在尝试在 40MB JSON 文件上运行 jsonlint,但它会以 5 的退出状态停止执行,并显示以下错误消息:

FATAL ERROR: JS Allocation Failed - process out of memory

有谁知道我怎样才能把这个 JSON 打印得漂亮吗?我想知道它是否与节点的--max-old-space-size 参数有关,但我也不确定如何将其传递给已安装的可执行文件。

如果我可以采用另一种方法以人类可读的缩进来呈现它,我也会很感激这些建议。

【问题讨论】:

  • 您是在尝试漂亮地打印 JSON 还是对其进行验证? jsonlint 是一个验证器。要漂亮打印,您可以使用JSON.stringify(JSON.parse(...), false, 2)
  • 绝对是漂亮的打印,但它仍然遇到相同的错误,即使使用node --max-old-space-size=2000 prettyPrint.js。我的整个脚本是:var fs = require('fs'); var f = fs.readFileSync('ugly.json'), o = JSON.parse(f), p = JSON.stringify( o, null, 3 ); fs.writeFileSync(p, 'pretty.json');。有什么建议吗?
  • 你有没有想过这个 JSON 会有多大的打印效果? 40MB 主要是单个长字符串还是大量嵌套对象?我问是因为它不一定不可能大于 2000MB,因为当您考虑到您还将占用大量 RAM 来存储解析的结构时。
  • 有很多很多的嵌套对象。我设法使用'\t' 的缩进成功地对其进行了字符串化,结果大约为72MB。行数是 1429654。如果我可以将其更改为空格缩进而不是制表符,那也很好,我猜。

标签: json node.js jsonlint


【解决方案1】:

jsonlint 基于 Jison,它是一个解析器生成器。写起来很简单,但是速度极慢。所以除非你真的需要它的一些功能(比如排序对象键),否则不要使用它。

如果您想漂亮地打印 JSON,请使用内置 - JSON.stringify(object, '\t')jju 模块 - require('jju').stringify(object, {mode: 'json'}) 以获得更紧凑但仍然可读的表示。

40MB 将产生大约 200-300MB 的空间,这绝对不是那么大。

【讨论】:

    猜你喜欢
    • 2014-11-23
    • 2019-06-28
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    相关资源
    最近更新 更多