如何更改node.js内存设置以允许非常大(> 100gb)的内存

时间:2017-03-23 16:24:43

标签: node.js garbage-collection v8

我有一个包含数百万个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,因此不会成为限制因素。我使用的这个数据集实际上只是需要处理的较大部分的一小部分,所以我必须扩展到我现在所处的范围之外。

环境详情:

  • Node.js是版本7
  • 在CentOS 7上运行

1 个答案:

答案 0 :(得分:1)

两个想法:

  • 尝试仅设置--max_old_space_size,不设置其他标记。 (您所看到的具体故障与新闻空间有关;我并不感到惊讶的是,几千兆字节的半空间大小会导致问题,因为没有理由让它变得那么大。)

  • 尝试使用较新的Node.js版本(8.x,甚至是https://github.com/v8/node上的vee-eight-lkgr分支,以获得最新的开发状态)。最近有一些修复工具可以更好地支持超大堆。