【问题标题】:How to process huge array of objects in nodejs如何在nodejs中处理大量对象
【发布时间】:2019-07-06 20:13:43
【问题描述】:

我想处理长度约为 100 000 的数组,而不会给 CPU 带来太多负载。我研究了流并偶然发现了 highlandjs,但我无法使其工作。

我也尝试过使用承诺和分块处理,但它仍然给 CPU 带来了很大的负载,如果需要,程序可能会很慢,但不应该给 CPU 带来负载

【问题讨论】:

  • CPU负载低的原因是什么?服务器对其他请求的响应?与您的托管计划有关的东西?什么?这将帮助我们知道要建议什么。另外,请显示您正在做什么处理的代码?就目前这个问题而言,没有办法回答它。对阵列进行处理需要一定数量的 CPU 周期。您所做的任何事情(除了重写处理数组以提高效率的实际代码之外)都不会改变。
  • 正如所写,这是XY problem,您在其中描述了您尝试解决问题的方法,而不是描述潜在的实际问题。如果您描述实际的潜在问题,我们可以为您提供更好的帮助。
  • 在 CPU 负载高时,服务器停止响应其他请求并且有时会崩溃,所以我想防止这种情况以及关于我没有发布的实现,因为它包含基本的数组处理,比如从其他数组中查找元素,使用它等

标签: node.js dataset nodejs-stream highland.js nodejs-server


【解决方案1】:

使用以单线程方式运行 Javascript 的 node.js,如果您希望服务器最大程度地响应传入请求,则需要从主 http 服务器进程中删除所有 CPU 密集型代码。这意味着在其他一些进程中执行 CPU 密集型工作。

有很多不同的方法可以做到这一点:

  1. 使用 child_process 模块启动另一个专门为执行 CPU 密集型工作而构建的 nodejs 应用。
  2. 对您的应用进行集群,以便您拥有 N 个不同的进程,这些进程既可以执行 CPU 密集型工作,也可以处理请求。
  3. 创建一个工作队列和一些将处理 CPU 密集型工作的工作进程。
  4. 使用较新的 Worker Threads 将 CPU 密集型工作转移到单独的 node.js 线程(需要 node v12+ 以获得稳定的非实验版线程)。

如果您不经常做这种 CPU 密集型工作,那么 #1 可能是最简单的。

如果您出于其他原因需要扩展(例如处理大量传入请求)并且您不经常执行 CPU 密集型工作 #2。

如果您经常执行 CPU 密集型工作,并且希望传入的请求处理始终具有最高优先级,并且您愿意让 CPU 密集型工作花费更长的时间,那么 #3(工作队列)或 #4(线程)可能是最好的,您可以调整工作人员的数量以优化您的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多