#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