Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 节点、承诺和绩效_Node.js_Performance_Memory_Nested Loops_Es6 Promise - Fatal编程技术网

Node.js 节点、承诺和绩效

Node.js 节点、承诺和绩效,node.js,performance,memory,nested-loops,es6-promise,Node.js,Performance,Memory,Nested Loops,Es6 Promise,我的问题是关于我的NodeJS应用程序的性能 如果我的程序运行12次迭代,每次迭代1.250.000=15.000.000次,则需要亚马逊的专用服务器在以下时间进行处理: r3.L:2个vCPU,6.5 ECU,15 GB内存-->123分钟 4.8XL:36个vCPU、132个ECU、60 GB内存-->102分钟 我有一些代码类似于下面的代码 start(); 开始(){ 对于(var i=0;i而言,这并不是垃圾收集器不能最佳地工作,而是它根本不能工作——您没有给它任何机会 在开发在节点中

我的问题是关于我的NodeJS应用程序的性能

如果我的程序运行12次迭代,每次迭代1.250.000=15.000.000次,则需要亚马逊的专用服务器在以下时间进行处理:

r3.L:2个vCPU,6.5 ECU,15 GB内存-->123分钟

4.8XL:36个vCPU、132个ECU、60 GB内存-->102分钟

我有一些代码类似于下面的代码

start();
开始(){

对于(var i=0;i而言,这并不是垃圾收集器不能最佳地工作,而是它根本不能工作——您没有给它任何机会

在开发在节点中进行优化的应用程序时,我注意到一件奇怪的事情。它似乎泄漏了内存,我不知道为什么。结果证明,这是因为很少有
console.log()
在不同的地方调用,我用来测试,看看发生了什么,因为看到递归调用的结果需要一些时间,所以我想在它执行时看到一些东西

你的例子与之非常相似

请记住,节点是单线程的。当您的计算运行时,其他任何东西都不能运行,包括GC。您的代码是完全同步和阻塞的,即使它以阻塞方式生成数百万个承诺。它是阻塞的,因为它从未到达事件循环

考虑这个例子:

var a = 0, b = 10000000;

function numbers() {
  while (a < b) {
    console.log("Number " + a++);
  }
}

numbers();
这里发生的事情是,主线程在一个同步循环中被阻塞,在这个循环中它一直在创建对象,但是GC没有机会释放它们

对于这样长时间运行的任务,您需要划分工作并偶尔进入事件循环

以下是解决此问题的方法:

var a = 0, b = 10000000;

function numbers() {
  var i = 0;
  while (a < b && i++ < 100) {
    console.log("Number " + a++);
  }
  if (a < b) setImmediate(numbers);
}

numbers();
它使用了1.5GB内存并崩溃

$(哪个时间)-v node numbers2.js 2>&1 | egrep'最大常驻人数|致命人数

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memory
    Maximum resident set size (kbytes): 1495968
    Maximum resident set size (kbytes): 56404
它使用了56MB的内存并完成了测试

另见这些答案:


不是垃圾收集器不能最佳工作,而是它根本不能工作——你没有给它任何机会

在开发在节点中进行优化的应用程序时,我注意到一件奇怪的事情。它似乎泄漏了内存,我不知道为什么。结果证明,这是因为很少有
console.log()
在不同的地方调用,我用来测试,看看发生了什么,因为看到递归调用的结果需要一些时间,所以我想在它执行时看到一些东西

你的例子与之非常相似

请记住,节点是单线程的。当您的计算运行时,其他任何东西都不能运行,包括GC。您的代码是完全同步和阻塞的,即使它以阻塞方式生成数百万个承诺。它是阻塞的,因为它从未到达事件循环

考虑这个例子:

var a = 0, b = 10000000;

function numbers() {
  while (a < b) {
    console.log("Number " + a++);
  }
}

numbers();
这里发生的事情是,主线程在一个同步循环中被阻塞,在这个循环中它一直在创建对象,但是GC没有机会释放它们

对于这样长时间运行的任务,您需要划分工作并偶尔进入事件循环

以下是解决此问题的方法:

var a = 0, b = 10000000;

function numbers() {
  var i = 0;
  while (a < b && i++ < 100) {
    console.log("Number " + a++);
  }
  if (a < b) setImmediate(numbers);
}

numbers();
它使用了1.5GB内存并崩溃

$(哪个时间)-v node numbers2.js 2>&1 | egrep'最大常驻人数|致命人数

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memory
    Maximum resident set size (kbytes): 1495968
    Maximum resident set size (kbytes): 56404
它使用了56MB的内存并完成了测试

另见这些答案:


如果你需要在一个紧密的循环中创建1500万个承诺,那么听起来你应该对你的应用程序进行大幅度的重组,而不是专注于如何加速循环。你能提供更多关于你的应用程序正在做什么的信息吗?为什么你需要这么多承诺?function3
做什么?首先-im新的节点…所以设计错误可能是非常有可能的!简而言之…该程序不使用/访问数据库,不写入磁盘或在多次迭代中需要的任何东西…它只是与一些简单的数组/对象一起工作…它只是对大量数据进行大量计算/分析…这些数据是从数据库中获取的-在所有这些之前的一步中…rea儿子为什么-我使用承诺…是因为节点我是通过设计异步的-我认为这是一个很好的方法?我习惯于使用同步代码,如.Net/C#…将计算包装在承诺中并不一定会使它性能更好,特别是当你创建了这么多承诺时。如果你搜索“节点密集计算”你可能会发现一些关于如何在不同的子进程上分割计算的很好的指导,利用比单个节点进程更多的CPU资源。也有一些可以帮助你。谢谢你,我理解…我知道我可以做1000件事…但我真的需要一些比我更有经验的人-告诉我-什么确切的解决方案对我来说是最好的…我可以很容易地用另一个星期的错误的“解决方案”,框架等…我需要具体的代码示例…我理解。如果你能解释你需要执行的计算类型(我假设“12”和“1250000”是指特定的),也许这会让人们更容易帮助你。如果你需要在一个紧密的循环中创建1500万个承诺,那么听起来你应该大幅重组你的应用程序,而不是专注于如何加快循环。你能提供更多关于你的应用程序正在做什么的信息吗?为什么你需要这么多承诺?W什么是
function3
do?首先-我是Node的新手…因此设计错误可能很有可能!简而言之…该程序不使用/access DB、写入磁盘或在多次迭代中需要的任何东西…它只需与一些简单的数组/对象一起工作…它只需对大量数据进行大量计算/分析…这是非常简单的从DB中获取-在所有这些之前的一步中…我使用承诺的原因…是因为我设计的节点是异步的-我认为这是一个尝试