【问题标题】:Writing very big data chunk synchroneously with node.js使用 node.js 同步写入非常大的数据块
【发布时间】:2012-06-07 17:25:59
【问题描述】:

我正在尝试将一个非常大的数据块(由 JSON.stringify 产生)写入一个文件。它必须是同步的,因为我想在 process:exit 事件期间保存它。但是,当使用 fs.writeFileSync() 时,Node 会抛出以下消息:

FATAL ERROR: JS Allocation failed - process out of memory

我已经尝试过 fs.createWriteStream(),但它似乎不起作用。此代码输出 0 字节,数据量中等,大则抛出同样的错误。

【问题讨论】:

  • 这就是为什么streams for,你能解释一下为什么fs.createWriteStream() 失败了吗?
  • @Mustafa 我不知道。最终文件不包含任何内容。
  • @NisonMaël 你的字符串长度是多少?你确定,FS 操作失败而不是JSON.stringify
  • @elmigranto 我刚刚检查过,失败似乎发生在 JSON.stringify 内部。这很奇怪,以前的测试在 writeFileSync 中失败了......你知道增加节点内存限制的任何方法吗? top 好像说我只使用了总内存大小的 33%
  • @NisonMaël 我个人从未遇到过这样的问题,这只是一个猜测。无论如何,that link 似乎是最新的,但您可能需要自己的 Node 构建。这两个也可能有帮助:12

标签: javascript node.js io


【解决方案1】:

我认为您需要的是一个“泵”。像http://elegantcode.com/2011/04/06/taking-baby-steps-with-node-js-pumping-data-between-streams/ 这样的东西会减轻你的内核缓冲区,它们不必一直保存所有的文本。

【讨论】:

  • 我不确定,我的数据来源是一个字符串,只涉及一个流
【解决方案2】:

我的问题出在 JSON.stringify 中。数据太大,无法存储在唯一的 JavaScript 字符串中。

我通过每行序列化一个属性解决了这个问题(因此对 JSON.stringify 有 X 次调用,其中 X 是我的对象中的属性数)。我的反序列化器通过添加每个属性来重建对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    相关资源
    最近更新 更多