Ошибка нехватки памяти, но только если я не консоль.регистрируйте объект, помещенный в массив

#javascript #node.js #memory

#javascript #node.js #память

Вопрос:

Некоторое время я боролся со скриптом для анализа огромных файлов CSV. Я получаю ошибку нехватки памяти, но только если я не регистрирую объект, который я отправляю на консоль…

Я собрал этот скрипт вместе, чтобы продемонстрировать проблему:

 function generateRandomString(
  num,
  possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
) {
  let text = "";
  for (let i = 0; i < num; i  ) {
    text  = possible.charAt(Math.floor(Math.random() * possible.length));
  }
  return text;
}

async function main() {
  const log = true;
  let storage = [];
  let x = 0;

  while (x < 100000) {
    let e = generateRandomString(100);
    let y = generateRandomString(1000);
    storage.push({ e, y });
    if (log) console.log(storage[x]);
    x  ;
  }
}
main().catch(console.log);
  

если для log переменной установлено значение false , я получаю следующую ошибку:

 <--- Last few GCs --->
on[15564:0x133f620]     6912 ms: Mark-sweep 1399.8 (1425.0) -> 1399.5 (1425.0) MB, 397.4 / 0.0 ms  (  0.0 ms in 16 steps since start of marking, biggest step 0.0 ms, walltime since start of marking 398 ms) (average mu = 0.094, current mu = 0.002) allocation[15564:0x133f620]     7873 ms: Mark-sweep 1400.2 (1425.0) -> 1399.7 (1425.0) MB, 961.5 / 0.0 ms  (  0.0 ms in 1 steps since start of marking, biggest step 0.0 ms, walltime since start of marking 962 ms) (average mu = 0.029, current mu = 0.000) allocation 

<--- JS stacktrace --->

==== JS stack trace =========================================

    0: ExitFrame [pc: 0x2c942895452b]
    1: StubFrame [pc: 0x2c94289556f3]
Security context: 0x0042034aede9 <JSObject>
    2: main [0x1789bf322769] [/home/james/Development/usefulFuncs/testy.js:~15] [pc=0x2c94289f2c62](this=0x18b546d884d9 <JSGlobal Object>)
    3: /* anonymous */ [0x1789bf3227a9] [/home/james/Development/usefulFuncs/testy.js:28] [bytecode=0x3630c94b2b59 offset=18](this=0x1789bf3228d9 <Object map = 0x2d17b4e02a41>,exports...

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
 1: 0x7f1a1c891328 node::Abort() [/usr/lib/x86_64-linux-gnu/libnode.so.64]
 2: 0x7f1a1c891371  [/usr/lib/x86_64-linux-gnu/libnode.so.64]
 3: 0x7f1a1ca72832 v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [/usr/lib/x86_64-linux-gnu/libnode.so.64]
 4: 0x7f1a1ca72a88 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [/usr/lib/x86_64-linux-gnu/libnode.so.64]
 5: 0x7f1a1ce017b2  [/usr/lib/x86_64-linux-gnu/libnode.so.64]
 6: 0x7f1a1ce12203 v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [/usr/lib/x86_64-linux-gnu/libnode.so.64]
 7: 0x7f1a1ce12af6 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [/usr/lib/x86_64-linux-gnu/libnode.so.64]
 8: 0x7f1a1ce1523d v8::internal::Heap::AllocateRawWithLigthRetry(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [/usr/lib/x86_64-linux-gnu/libnode.so.64]
 9: 0x7f1a1ce15292 v8::internal::Heap::AllocateRawWithRetryOrFail(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [/usr/lib/x86_64-linux-gnu/libnode.so.64]
10: 0x7f1a1cde3bf4 v8::internal::Factory::NewFillerObject(int, bool, v8::internal::AllocationSpace) [/usr/lib/x86_64-linux-gnu/libnode.so.64]
11: 0x7f1a1d04e4e5 v8::internal::Runtime_AllocateInNewSpace(int, v8::internal::Object**, v8::internal::Isolate*) [/usr/lib/x86_64-linux-gnu/libnode.so.64]
12: 0x2c942895452b 
Aborted
  

если для него установлено значение true , скрипт выполняется до завершения

в самом сценарии, где я обнаружил эту проблему, я попытался сохранить данные в файлах в папке на жестком диске. общий размер папки находился в диапазоне килобайт, однако, когда я нажимаю на массив, вместо этого размер процесса nodejs, кажется, увеличивается экспоненциально в диапазоне нескольких гигабайт…

Кто-нибудь может сказать мне, что происходит?

Комментарии:

1. При тестировании у меня было прямо противоположное: log = true он разбил мой FireFox, но log = false это занимает около 20 секунд , и скрипт завершается без ошибок или каких-либо выходных данных. Это то, что я могу лучше понять, объем вывода был слишком большим.

2. node — это другой движок, чем FF

3. FF использует движок Gecko, если у вас нет Node.js тогда я предлагаю использовать Chrome для запуска этого. Узел основан на движке chromes V8