【发布时间】: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