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

我有一个相当大的json文件包含几百万geojson点。 我可以在没有问题的情况下使用JSONParser读取它。 然后我试图用geojson-vt处理文件。

对于我使用的是700mb的testing文件集,当我将–max_old_space_size v8参数设置为8GB左右时,这个工作正常。 现在我正在尝试使用一个3GB的完整文件来处理单个状态并遇到问题。 看起来无论设置max_old_space_size参数有多高,在分配失败之前,垃圾收集器都会使用大约34GB,尽pipe我将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 

看起来不pipe什么事情都不会超过这个限制。 有其他的参数,我可以设置让它增长更多和GCless?

我意识到这不是node.js的典型用例,它可能不是这个工作的最佳工具,但是如果我能得到geojson-vt的工作,那么还有一些其他库可以使这个数据集的处理变得更容易,如果可能的话,我想走这条路。

我基本上有无限的内存,可以用于这个任务; 高达几个TB,所以这不会成为一个限制因素。 我使用的这个数据集实际上是一个很大的一部分,将需要处理,所以我将不得不扩大到现在的位置。

环境详情:

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

两个想法:

  • 尝试只设置 – --max_old_space_size ,没有其他标志。 (您所看到的具体失败与新闻空间有关;我不惊讶几个千兆字节的半空间大小导致问题,因为没有理由使它变大。)

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