我有一个包含数百万个geojson点的相当大的json文件。我能够在没有问题的情况下使用JSONParser读取它。然后,我尝试使用geojson-vt处理文件。
对于我使用的测试文件集是700mb,当我将--max_old_space_size v8参数设置为8g左右时,这工作正常。现在,我尝试使用3gb完整文件处理单个状态并遇到问题。似乎无论我设置max_old_space_size参数有多高,它只会在垃圾回收器在分配失败时杀死它时使用大约34gb,即使我将max_old_space_size设置为50gb。
我已经阅读了可能会使用的其他一些v8参数。这是我试图运行的最后一个命令:
node --max_executable_size=5000 --max_old_space_size=54000 --max-semi-space-size=5000 -nouse-idle-notification --noconcurrent_sweeping app.js
这是该命令的失败。
<--- Last few GCs --->
[27445:0x2e900d0] 587348 ms: Scavenge 29492.1 (31038.4) -> 29422.8 (31521.9) MB, 2092.6 / 0.0 ms allocation failure
[27445:0x2e900d0] 591039 ms: Scavenge 30244.6 (31803.4) -> 30175.9 (32273.4) MB, 2070.4 / 0.0 ms allocation failure
[27445:0x2e900d0] 594706 ms: Scavenge 30972.9 (32544.4) -> 30904.8 (33028.4) MB, 2060.4 / 0.0 ms allocation failure
[27445:0x2e900d0] 620992 ms: Scavenge 31727.0 (33311.4) -> 31656.7 (2783311.9) MB, 24589.5 / 0.0 ms allocation failure
<--- JS stacktrace --->
Cannot get stack trace in GC.
FATAL ERROR: NewSpace::Rebalance Allocation failed - process out of memory
1: node::Abort() [node]
2: 0x12299bc [node]
3: v8::Utils::ReportOOMFailure(char const*, bool) [node]
4: v8::internal::V8::FatalProcessOutOfMemory(char const*, bool) [node]
5: 0xa6b34b [node]
6: v8::internal::MarkCompactCollector::EvacuateNewSpaceAndCandidates() [node]
7: v8::internal::MarkCompactCollector::CollectGarbage() [node]
8: v8::internal::Heap::MarkCompact() [node]
9: v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [node]
10: v8::internal::Heap::CollectGarbage(v8::internal::GarbageCollector, v8::internal::GarbageCollectionReason, char const*, v8::GCCallbackFlags) [node]
11: v8::internal::Factory::NewFillerObject(int, bool, v8::internal::AllocationSpace) [node]
12: v8::internal::Runtime_AllocateInTargetSpace(int, v8::internal::Object**, v8::internal::Isolate*) [node]
13: 0x1a296258ed46
Aborted
似乎无论它赢得了什么,都超过了这个极限。我可以设置其他参数以使其增长更多并且GC更少吗?
我意识到这不是node.js的典型用例,它可能不是这项工作的最佳工具,但如果我能让geojson-vt工作那么就有了其他一些可以更容易处理这个数据集的库,所以如果可能的话,我想走这条路。
我基本上可以使用无限的内存来完成这项任务;高达几TB,因此不会成为限制因素。我使用的这个数据集实际上只是需要处理的较大部分的一小部分,所以我必须扩展到我现在所处的范围之外。
环境详情:
答案 0 :(得分:1)
两个想法:
尝试仅设置--max_old_space_size
,不设置其他标记。 (您所看到的具体故障与新闻空间有关;我并不感到惊讶的是,几千兆字节的半空间大小会导致问题,因为没有理由让它变得那么大。)
尝试使用较新的Node.js版本(8.x,甚至是https://github.com/v8/node上的vee-eight-lkgr
分支,以获得最新的开发状态)。最近有一些修复工具可以更好地支持超大堆。