【问题标题】:Fatal error in ../deps/v8/src/handles.h, CHECK(location_ != NULL) failed / FATAL ERROR: CALL_AND_RETRY_0 Allocation failed - process out of memory../deps/v8/src/handles.h 中的致命错误,CHECK(location_ != NULL) 失败/致命错误:CALL_AND_RETRY_0 分配失败 - 进程内存不足
【发布时间】:2014-11-04 02:21:18
【问题描述】:

我在 ubuntu 服务器上安装了节点,并尝试从服务器运行基本节点程序。在其中,我尝试读取 13 个 json 文件,范围从 120mb - 500+ mb。以前,我在本地运行它,这对于较小的文件是可以的,但在尝试读取较大的文件时遇到以下错误:

FATAL ERROR: CALL_AND_RETRY_0 Allocation failed - process out of memory

我需要在读取文件后能够通过json对象进行解析,所以无法逐行读取。而且我需要能够从解析所有对象的结果中构建一个累积对象。就像我说的,代码工作得很好,并且在处理 3 个以上的小文件(

当尝试在服务器上运行它时,我遇到了同样的问题(它适用于较小的文件),但在较大的文件上崩溃并出现以下错误:

# Fatal error in ../deps/v8/src/handles.h, line 48
# CHECK(location_ != NULL) failed
#

==== C stack trace ===============================

 1: V8_Fatal
 2: v8::String::NewFromUtf8(v8::Isolate*, char const*, v8::String::NewStringType, int)
 3: node::StringBytes::Encode(v8::Isolate*, char const*, unsigned long, node::encoding)
 4: node::Buffer::Utf8Slice(v8::FunctionCallbackInfo<v8::Value> const&)
 5: v8::internal::FunctionCallbackArguments::Call(void (*)(v8::FunctionCallbackInfo<v8::Value> const&))
 6: ??
 7: ??
[1]    12381

非法硬件指令(核心转储)节点 main2.js

这是它失败的代码块:

for (var i = 0; i < jsonFileArray.length; i++) {
    if (jsonFileArray[i].match(/\.json$/)) {
      jsonObject = JSON.parse(fs.readFileSync(dirPath + jsonFileArray[i]));
      categoryListObject = jsonManipulator.getFieldValues("Categories", jsonObject, categoryListObject);
    }
}

我尝试增加我的 --max-old-space-size,但这没有帮助。另外,我应该澄清一下,我对编码还很陌生,从来没有用 C 写过任何东西,所以尽管用谷歌搜索了这个,但我不确定下一步该去哪里。所以真的,任何帮助/指导/见解/朝着正确方向迈出的一步都将非常感激!谢谢!

【问题讨论】:

  • 使用调试器...
  • 对于大型 json,我建议使用类似 SAX 的解析器,其想法是不将整个文件加载到内存中,而是迭代其内容。

标签: c++ json node.js ubuntu memory-management


【解决方案1】:

您正在将整个巨大的 JSON 文件解析到内存中,因此这是可以预料的。尝试使用类似这个模块的东西:https://github.com/dominictarr/JSONStream 并使用读取流 (http://nodejs.org/api/fs.html#fs_fs_createreadstream_path_options) 读取文件。

【讨论】:

  • 我添加了 JSONStream 并尝试在执行任何更复杂的操作之前简单地记录数据,但它最终还是给了我错误:FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory
  • 删除所有逻辑,看看您能否简单地从头到尾流式传输单个文件,将其逐块记录到控制台。也许用 JSON 流代码更新答案?
猜你喜欢
  • 2014-11-23
  • 2019-06-28
  • 1970-01-01
  • 2015-01-31
  • 1970-01-01
  • 1970-01-01
  • 2018-11-10
  • 2016-12-19
  • 1970-01-01
相关资源
最近更新 更多