wdG*_*wix 3 javascript performance node.js
如果我必须在 Node 中迭代大量数据,我可以采取哪些预防措施来避免使服务器对其他请求的响应速度变慢?所花费的时间为迭代到结束的数额是对我至关重要不是,我应该考虑像这样,还是有其他类似的技巧,我应该知道的?
以下是在 nodejs 中处理大型数据集的一些注意事项,这些注意事项来自我处理数十亿个数据集和 100,000,000 个项目的单个数组的经验。
1. 尽量减少垃圾收集工作。 尽你所能,避免在处理大型数据集的主循环中创建临时对象。这包括局部范围的变量(其中通过每次循环调用创建一个新变量)并包括任何返回对象的函数/方法。如果您的代码每次通过循环创建 10 个对象,并且数组中有 120 万个项目,那么 GC 必须处理 1020 万个对象。除了 GC 处理它们所需的所有 CPU 之外,它也是大量内存使用高峰期,因为 GC 会让事情不断累积,直到内存变得稀缺或找到一些空闲时间为止。
2. 测量处理最坏情况阵列所需的时间并尽可能多地改进它。 使用特定的性能测试来研究循环处理的性能,以便您现在确切地知道最大数组处理时间是多少。
3. 确定您的服务器可接受的延迟延迟。 这实际上取决于应用程序以及遇到这种延迟的频率,因此您必须弄清楚什么对您有用。偶尔的 100 毫秒延迟对于许多应用程序来说可能没什么大不了的,但如果这种情况经常发生,它就会成为一个问题,或者如果您的服务器有某种响应关键的方面(例如游戏),那么 100 毫秒就太长了.
4. 将处理移至工作线程。 如果您的最佳性能低于您可接受的延迟,那么您可能希望将处理移至 nodejs 工作线程。创建一个线程池(服务器中每个实际 CPU 核心一个)然后创建一个按 FIFO 顺序提供服务的工作队列可能是有意义的。当需要完成大型数组作业时,您将其放入队列并返回一个承诺。如果工作线程可用,则作业会立即发送到工作线程。如果所有工作线程都忙,则它会一直处于队列中,直到线程完成并空闲为止。此时,队列中最旧的项目(FIFO 顺序)被发送到工作线程。当一个工作线程完成工作时,结果被传回并且一个承诺被解决,等待结果的代码得到解决的承诺通知。
5. 如果可能,使用 SharedArrayBuffer。 您不希望在工作线程之间来回复制大量数据,因为这会消耗 CPU 并导致 CPU 进行大量工作。在 Worker Threads 中处理大量数据的一个关键技术是将这些数据放入 SharedArrayBuffer 中,SharedArrayBuffer 可以直接传递给 Worker Thread 作为参考,无需任何复制。这对于 CPU、GC 和峰值内存使用来说效率更高。
6. 了解使用 SharedArrayBuffer 的并发后果。 由 Worker Threads 操作的 SharedArrayBuffer 是 node.js 中可以暴露于多线程竞争条件的一个地方。所以,你需要一个设计模型来说明你将如何去做。最简单的模型是进行设置,以便只有一个线程可以访问同一个 SharedArrayBuffer。你在主线程中创建它,然后当你将它传递给工作线程进行处理时,你将 SharedArrayBuffer 引用传递给 WorkerThread 并且你在主线程中完全忘记了它(不要将它存储在其他地方)。这意味着主线程本质上将它的临时所有权传递给了工作线程。当工作线程完成时,它将所有权传回(在它发送的结果消息中返回 SharedArrayBuffer 引用)。这个模型很简单,因为你可以
7. 使用原子来保护共享数据。 如果您不能像上面讨论的那样对 SharedArrayBuffer 使用简单的访问模型,那么您可能需要使用Atomics来保护数据的完整性。
要考虑的其他一些设计选项:
1. 将数据打散,分块处理。 您可以在块中编写处理,以便在块之间编程一个短暂的延迟,以便主线程有机会处理块之间的消息。这就是我们在访问线程之前被迫做事情的方式。有关示例,请参阅在不阻塞 UI 的情况下迭代数组的最佳方法。这有多实用或者这会导致多少重写实际上取决于问题和数据。在服务器上,我现在可能倾向于使用线程,而不是尝试将处理分成小块。
2. 考虑数据库是否可以帮助您。 数据库用于管理大量数据,它们通常在单独的进程中执行(这有助于解决服务器响应问题)。
3. 工人列表类。 这里有一个WorkerList班,我为了排队数据使用工作池使用。这是一个更大的加密测试应用程序的一部分,该应用程序使用多个线程来卸载大量加密工作。整个存储库都在 Github 上。
4. 在数据到达时逐步处理数据。 您提到“为数据库插入做好准备”。根据具体问题,您甚至可能根本不需要积累大量数据。也许您可以在数据到达时以更增量的方式处理数据,并且通过随手处理,您永远不会遇到干扰主服务器工作的巨大工作。到您拥有 120 万个项目数组的程度。
| 归档时间: |
|
| 查看次数: |
2215 次 |
| 最近记录: |