首页 > 解决方案 > 致命错误:接近堆限制的无效标记压缩分配失败-脚本上的 JavaScript 堆内存不足

问题描述

我想查询一大块数据,但我使用的 API 只允许每个请求有几个响应,所以我使用这样的 for 循环拆分我的请求:

function writeTransfers() {
    console.log("starting ...");

    for(let i = 4620855; i < 13094434; i = i + 10) {
        maker.getPastEvents("Transfer", { fromBlock: i, toBlock: i + 9 }).then(response => {
            const buildPath = path.resolve(__dirname, "build");
            const JSONCode = fs.readFileSync("./build/transfers.json", "utf-8");
            let code = JSON.parse(JSONCode);
            code.push(response[0]);
    
            fs.outputJsonSync(
              path.resolve(buildPath, "transfers.json"),
              code
          );
        });
    }

    console.log("done ...");

}

基本上,代码从块 4620855 开始,到块 13094434 结束,查询块 i 的数据到块 i + 10,然后将 JSON 推送到 JSON 文件中。所以 JSON 文件的大小会随着时间的推移而增加,有时我会收到这个错误:

<--- Last few GCs --->

[9236:0000022EEFA59030]   161438 ms: Mark-sweep (reduce) 2023.6 (2053.7) -> 2022.8 (2053.9) MB, 1228.6 / 5.2 ms  (average mu = 0.194, current mu = 0.037) allocation failure scavenge might not succeed
[9236:0000022EEFA59030]   162679 ms: Mark-sweep (reduce) 2023.9 (2050.9) -> 2023.1 (2051.9) MB, 1229.1 / 5.0 ms  (average mu = 0.106, current mu = 0.010) allocation failure scavenge might not succeed


<--- JS stacktrace --->

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
 1: 00007FF6EBA2052F napi_wrap+109311
 2: 00007FF6EB9C5256 v8::internal::OrderedHashTable<v8::internal::OrderedHashSet,1>::NumberOfElementsOffset+33302
 3: 00007FF6EB9C6026 node::OnFatalError+294
 4: 00007FF6EC29163E v8::Isolate::ReportExternalAllocationLimitReached+94
 5: 00007FF6EC2764BD v8::SharedArrayBuffer::Externalize+781
 6: 00007FF6EC12094C v8::internal::Heap::EphemeronKeyWriteBarrierFromCode+1516
 7: 00007FF6EC12BC8A v8::internal::Heap::ProtectUnprotectedMemoryChunks+1258
 8: 00007FF6EC128E39 v8::internal::Heap::PageFlagsAreConsistent+2457
 9: 00007FF6EC11DA61 v8::internal::Heap::CollectGarbage+2033
10: 00007FF6EC11BC65 v8::internal::Heap::AllocateExternalBackingStore+1317
11: 00007FF6EC13C057 v8::internal::Factory::NewFillerObject+183
12: 00007FF6EBE6C0B1 v8::internal::interpreter::JumpTableTargetOffsets::iterator::operator=+1409
13: 00007FF6EC319FED v8::internal::SetupIsolateDelegate::SetupHeap+463949
14: 00007FF6EC31AE9D v8::internal::SetupIsolateDelegate::SetupHeap+467709
15: 00000030E4FF8975

这是我第一次收到它,除了在 angular 或 vue.js 上运行构建脚本外,我在网上找不到太多东西。

谁能提供一些关于如何解决这个问题的见解?也许逻辑不正确,应该以其他方式完成?

先感谢您

标签: javascriptnode.jsjsonloopswrite

解决方案


推荐阅读