【发布时间】:2021-08-04 07:14:12
【问题描述】:
我正在从 GCP 租用 96 核、360gb ram linux VM。我的函数正在生成 100.000.000 个组合(项目数组),每个组合都被传递到一个相当繁重的函数中。我正在运行 numberOfCores - 1 workers 将任务分成相等的部分。
实例使用不同的选项值抛出不同的错误,但所有错误的共同点是:JavaScript heap out of memory。
我玩过这些:
--max-old-space-size, --max-semi-space-size
第一个选项是最受欢迎的,据我所知,大多数情况下都可以解决问题,但在我的情况下却没有。
我正在尝试研究解决此问题的所有可能选项(因为我不敢相信 96 个内核,而 360gb 内存还不够),我发现了一些:
对于工人:
- maxOldGenerationSizeMb
- maxYoungGenerationSizeMb
- codeRangeSizeMb
- stackSizeMb
对于节点(不包括已经提到的):
- --v8-pool-size
- --huge-max-old-generation-size
- --stack-trace-limit
它们的文档记录不是很好,我想了解每个解决我的内存不足问题的意义,并将它们设置为最大限度地利用硬件资源而不导致崩溃。
【问题讨论】:
-
你真的需要一次在 RAM 中的所有组合吗?通常我一次只需要评估一个组合。那行得通吗?如果是这样,您可以使用生成器或基于回调的代码一次评估一个组合。如果您有兴趣,我有一些排列代码我写了一些时间来测试这个想法
-
我目前的实现是计算所有组合(以获得总长度),获取可用的核心数量 - 1,从中计算每个核心要处理的元素数量,拆分大数组成块(并同时拼接),然后用他们自己的块启动工人。该错误通常在第 10-15 个 worker 启动后抛出。我想看看你的想法,也许我的想法是错误的。
-
我想你是通过递归函数生成组合?
-
@GergőHorváth - 你运气好吗?我有一台 256gb 的服务器,我的主节点进程及其
worker_threads 遇到了相同的out of memory问题
标签: node.js