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