Неустранимая ошибка в ../deps/v8/src/handles.h, CHECK (location_! = NULL) завершилась неудачно / FATAL ERROR: CALL_AND_RETRY_0 Распределение не выполнено - процесс исчерпал память

0

Я установил узел на сервере ubuntu и пытаюсь запустить базовую программу узла с сервера. В нем я пытаюсь читать в 13 файлах json, начиная от 120mb - 500+ mb. Раньше я запускал его локально, что было нормально для файлов меньшего размера, но при попытке прочитать более крупные ошибки выполнялась следующая ошибка:

FATAL ERROR: CALL_AND_RETRY_0 Allocation failed - process out of memory

Мне нужно иметь возможность анализировать через json-объект после прочтения файла, поэтому я не могу его прочесть по строкам. И мне нужно иметь возможность построить кумулятивный объект из результатов анализа всех объектов. Как я уже сказал, код работает очень хорошо и дает результат, который я ожидаю при работе с меньшими файлами 3+ (<20 Мб), но с ошибками с большими.

Когда вы пытаетесь запустить его на сервере, у меня такая же проблема (он будет работать отлично с меньшими файлами), но с ошибкой на более крупных ошибках:

# 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

Неверная аппаратная инструкция (core dumped) node 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, но это не помогло. Кроме того, я должен пояснить, что я довольно новичок в кодировании и никогда не писал ничего на C, поэтому, несмотря на то, что я это делаю, я не уверен, куда идти дальше. Так что действительно, любая помощь/руководство/проницательность/шаг в правильном направлении были бы оценены супер! Благодарю!

  • 0
    Иди с отладчиком ...
  • 0
    Для больших jsons я предлагаю использовать парсеры, подобные SAX, идея не загружать весь файл в память, а перебирать его содержимое.
Теги:
memory-management

1 ответ

0

Вы разбираете весь огромный файл JSON в память, чтобы этого можно было ожидать. Попробуйте использовать что-то вроде этого модуля: https://github.com/dominictarr/JSONStream и прочитайте файлы с потоком чтения (http://nodejs.org/api/fs.html#fs_fs_createreadstream_path_options).

  • 0
    Я добавил JSONStream и попытался просто записать данные в журнал, прежде чем делать что-то более сложное, но это все равно в конечном итоге дало мне ошибку: FATAL ERROR: CALL_AND_RETRY_2 Распределение не выполнено - процесс завершен
  • 0
    Удалите всю логику и посмотрите, можете ли вы просто передать один файл от начала до конца, записав его по частям на консоль. Может быть, обновить ответ с помощью кода потока JSON?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню