如何修复 Node.js 堆内存不足错误?

时间:2021-01-03 16:04:55

标签: node.js mongodb memory memory-leaks

我想读取位于磁盘上的 JSON 文件的内容并将其内容插入到 MongoDB 数据库表中。代码如下:

const mongodb = require('mongodb');
const MongoClient = mongodb.MongoClient;

const fs = require('fs');
const dataFolder = './json-data';

const connectionURL = 'mongodb://127.0.0.1:27017';
const databaseName = 'database';

MongoClient.connect(connectionURL, {
    useNewUrlParser: true,
    useUnifiedTopology: true
}, (error, client) => {
    if (error) {
        return console.log('Unable to connect to database!');
    }

    const db = client.db(databaseName);
    fs.readdir(dataFolder, (err, files) => {
        files.forEach(file => {
            insertCollection(file);
        });
    });

    function insertCollection(file) {
        fs.readFile(`${dataFolder}\\${file}`, "utf8", (err, res) => {

            db.collection('barcode').insertMany(JSON.parse(res), (err, res) => {
                if (err) {
                    return console.log('Unable to insert barcode!');
                }

                console.log(typeof res.ops);
            });
        })
    }
});

此后不久,Node.js 消失了:

<--- Last few GCs --->

[3144:00000258BE35C750]    24799 ms: Mark-sweep (reduce) 2046.7 (2056.6) -> 2046.5 (2058.4) MB, 704.2 / 0.0 ms  (+ 0.0 ms in 15 steps since start of marking, biggest step 0.0 ms, walltime since start of marking 706 ms) (average mu = 0.121, current mu = 0.[3144:00000258BE35C750]    25503 ms: Mark-sweep (reduce) 2047.5 (2054.4) -> 2047.4 (2055.1) MB, 700.5 / 0.0 ms  (+ 0.0 ms in 2 steps since start of marking, biggest step 0.0 ms, walltime since start of marking 702 ms) (average mu = 0.066, current mu = 0.0

<--- JS stacktrace --->

FATAL ERROR: MarkCompactCollector: young object promotion failed Allocation failed - JavaScript heap out of memory
 1: 00007FF65D28021F napi_wrap+109311
 2: 00007FF65D225286 v8::internal::OrderedHashTable<v8::internal::OrderedHashSet,1>::NumberOfElementsOffset+33302
 3: 00007FF65D226056 node::OnFatalError+294
 4: 00007FF65DAF054E v8::Isolate::ReportExternalAllocationLimitReached+94
 5: 00007FF65DAD53CD v8::SharedArrayBuffer::Externalize+781
 6: 00007FF65D97F85C v8::internal::Heap::EphemeronKeyWriteBarrierFromCode+1516
 7: 00007FF65D96A49B v8::internal::NativeContextInferrer::Infer+59243
 8: 00007FF65D94F9CF v8::internal::MarkingWorklists::SwitchToContextSlow+57327
 9: 00007FF65D96361B v8::internal::NativeContextInferrer::Infer+30955
10: 00007FF65D95A73D v8::internal::MarkCompactCollector::EnsureSweepingCompleted+6269
11: 00007FF65D96286E v8::internal::NativeContextInferrer::Infer+27454
12: 00007FF65D9667FB v8::internal::NativeContextInferrer::Infer+43723
13: 00007FF65D970052 v8::internal::ItemParallelJob::Task::RunInternal+18
14: 00007FF65D96FFE1 v8::internal::ItemParallelJob::Run+641
15: 00007FF65D9438E3 v8::internal::MarkingWorklists::SwitchToContextSlow+7939
16: 00007FF65D95ABEC v8::internal::MarkCompactCollector::EnsureSweepingCompleted+7468
17: 00007FF65D959434 v8::internal::MarkCompactCollector::EnsureSweepingCompleted+1396
18: 00007FF65D956F98 v8::internal::MarkingWorklists::SwitchToContextSlow+87480
19: 00007FF65D9855E1 v8::internal::Heap::LeftTrimFixedArray+929
20: 00007FF65D9876C5 v8::internal::Heap::PageFlagsAreConsistent+789
21: 00007FF65D97C971 v8::internal::Heap::CollectGarbage+2033
22: 00007FF65D97AB75 v8::internal::Heap::AllocateExternalBackingStore+1317
23: 00007FF65D99AF67 v8::internal::Factory::NewFillerObject+183
24: 00007FF65D6CAE7F v8::internal::interpreter::JumpTableTargetOffsets::iterator::operator=+1039
25: 00007FF65DB78EFD v8::internal::SetupIsolateDelegate::SetupHeap+463949
26: 0000001C8935F3C0

我尝试过 memwatch,但距上次提交已经过去 9 年了,我什至无法安装它。如何解决这样的泄漏问题?

0 个答案:

没有答案