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

如何更改node.js内存设置以允许非常大(>;100gb)的内存,node.js,garbage-collection,v8,Node.js,Garbage Collection,V8,我有一个相当大的json文件,其中包含数百万个geojson点。我可以用JSONParser毫无问题地读入它。然后,我尝试使用处理该文件 对于我使用的700mb的测试文件集,当我将--max_old_space_size v8参数设置为8gb左右时,效果很好。现在,我正试图使用一个3gb的完整文件来处理一个状态,但遇到了一些问题。似乎无论我将max_old_space_size参数设置得多高,在垃圾收集器在分配失败时杀死它之前,它只会使用大约34gb,即使我将max_old_space_size

我有一个相当大的json文件,其中包含数百万个geojson点。我可以用JSONParser毫无问题地读入它。然后,我尝试使用处理该文件

对于我使用的700mb的测试文件集,当我将--max_old_space_size v8参数设置为8gb左右时,效果很好。现在,我正试图使用一个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

[27445:0x2e900d0]587348毫秒:清除29492.1(31038.4)->29422.8(31521.9)MB,2092.6/0.0毫秒分配失败
[27445:0x2e900d0]591039毫秒:清除30244.6(31803.4)->30175.9(32273.4)MB,2070.4/0.0毫秒分配失败
[27445:0x2e900d0]594706毫秒:清除30972.9(32544.4)->30904.8(33028.4)MB,2060.4/0.0毫秒分配失败
[27445:0x2e900d0]620992毫秒:清除31727.0(33311.4)->31656.7(2783311.9)MB,24589.5/0.0毫秒分配失败
无法在GC中获取堆栈跟踪。
致命错误:新闻空间::重新平衡分配失败-进程内存不足
1:node::Abort()[node]
2:0x12299bc[节点]
3:v8::Utils::ReportOOMFailure(char const*,bool)[节点]
4:v8::内部::v8::FatalProcessOutOfMemory(char const*,bool)[节点]
5:0xa6b34b[节点]
6:v8::internal::MarkCompactCollector::VacueneWSpaceandPendidates()[node]
7:v8::internal::MarkCompactCollector::CollectGarbage()[node]
8:v8::internal::Heap::MarkCompact()[node]
9:v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector,v8::GCCallbackFlags)[节点]
10:v8::internal::Heap::CollectGarbage(v8::internal::GarbageCollection,v8::internal::GarbageCollectionReason,char const*,v8::GCCallbackFlags)[节点]
11:v8::internal::Factory::NewFillerObject(int、bool、v8::internal::AllocationSpace)[节点]
12:v8::internal::Runtime_AllocateInTargetSpace(int,v8::internal::Object**,v8::internal::Isolate*)[节点]
13:0x1a296258ed46
流产
看起来不管发生什么,它都不会超过这个极限。我是否可以设置其他参数以允许它增长得更多和更少

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

我基本上有无限的内存,可以用于这项任务;最多几个TBs,所以这不是一个限制因素。我使用的这个数据集实际上是一个需要处理的大数据集的一小部分,所以我必须扩展到我现在所在的位置

环境详情:

  • Node.js是版本7
  • 在CentOS 7上运行
    • 两个想法:

      • 尝试只设置
        --最大旧空间大小
        ,不设置其他标志。(你看到的具体失败与新闻空间有关;我并不奇怪几GB的半空间大小会引起问题,因为没有理由把它弄得那么大。)

      • 尝试使用更新的Node.js版本(8.x,甚至是
        vee-eight-lkgr
        分支,了解最新的开发状态)。最近有一些修复程序可以更好地支持超大堆


      能否将大文件拆分为适当的部分并执行缓冲处理?你能做流解析吗?也许类似的东西可以帮助你不幸的是,我正在处理的部分依赖于一次获得所有可用的数据。它试图根据这些要点来总结瓷砖。我正在研究修改库,看看是否有什么可以获得的,但目前看来,我似乎有点卡住了。将它们拆分是最后一种选择,但当我需要为web客户端提供汇总磁贴时,这会使我的工作变得更加困难。如果您的算法可以缓冲,您可能需要尝试流方法可能您的算法可以通过多次传递来完成,每一次都可以扫描所有数据,聚合或处理某些内容,然后为下一次传递或/和迭代输出数据我已经用一个库完成了这项工作,但该库直接说明了如何对其进行优化。这一次是引起问题的原因:特别是geojsonvt(json,options)调用。更具体地说,V8 5.8引入了对任意大堆的官方支持,请参阅:。所以节点7.x太旧了(它有V8 5.5)。