我在ubuntu服务器上安装了节点,并尝试从服务器运行基本节点程序。在其中,我尝试读取13个json文件,范围从120mb到500+ mb。以前,我在本地运行它,这对于较小的文件是可以的,但在尝试阅读较大的文件时遇到以下错误:
FATAL ERROR: CALL_AND_RETRY_0 Allocation failed - process out of memory
我需要能够在读取文件后解析json对象,所以我无法逐行读取它。我需要能够从解析所有对象的结果中构建一个累积对象。就像我说的那样,代码工作正常并产生我在处理3个以上较小的文件(< 20mb)时所期望的结果,但是与较大的文件一起崩溃。
当尝试在服务器上运行它时,我遇到了同样的问题(它可以在较小的文件中正常工作),但在较大的文件上崩溃并出现以下错误:
# 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中写过任何内容,所以尽管谷歌搜索了这一点,但我还不确定下一步该怎么做。所以,真正的任何帮助/指导/见解/步骤都将受到超级赞赏!谢谢!
答案 0 :(得分:0)
您正在将整个巨大的JSON文件解析到内存中,这是可以预期的。尝试使用类似此模块的内容:https://github.com/dominictarr/JSONStream并使用读取流(http://nodejs.org/api/fs.html#fs_fs_createreadstream_path_options)读取文件。