【问题标题】:nodejs function exhausted all the memory?nodejs函数耗尽了所有内存?
【发布时间】:2017-09-27 09:57:48
【问题描述】:

我使用下面的代码来解析一个 Ascii Stl 文件(带有顶点坐标)和每个顶点的输出坐标。虽然stl文件只有30M左右,但是node脚本运行时,控制台上的系统还剩下600M左右的mem

roofe@localhost:~/node$ ls -l DNA_mit_Anhnger.stl 
-rw-r--r-- 1 roofe roofe 34964929 Sep 27 09:50 DNA_mit_Anhnger.stl

~/node$ node test.js DNA_mit_Anhnger.stl 
vertex   4.893074e-001 8.750000e+000 2.695633e-001
free mem:: 557mb
vertex   5.357143e-001 8.750000e+000 3.077444e-001
free mem:: 557mb

而运行内存的脚本将被耗尽,直到系统杀死脚本

Killed
roofe@localhost:~/node$ 

脚本运行时,我也用另一个终端查看系统mem,(这里是在2GB Mem Ubuntu16 Server LTS VMvare Machine上)

 roofe@localhost:~/node$ ps v

   PID TTY      STAT   TIME  MAJFL   TRS   DRS   RSS %MEM COMMAND
  1064 tty1     S+     0:00      1   975 21492     4  0.0 -bash
 18623 pts/1    Ss+    0:00    715   975 21612     4  0.0 -bash
 19140 pts/2    Ss     0:00   1352   975 21604    16  0.0 -bash
 19482 pts/3    Ss     0:00   2594   975 21596  1124  0.1 -bash
 77681 pts/2    Rl+    0:19 120131 10894 2090529 737716 73.9 node

这是脚本,

var fs = require("fs");
var os = require('os');
var data = fs.readFileSync(process.argv[2]);
var parseAscii = function(data) {
    var offset = 0;
    var str = '';
    while(offset = data.indexOf('vertex', ++offset)) {
        str =  data.substr(offset, data.indexOf('\n', offset) - offset);
        console.log(str);
        console.log('free mem:: ' + Math.ceil(os.freemem()/(1024*1024)) + 'mb');
    }
    console.log('finish');
}
parseAscii(data.toString());

Ascii Stl文件格式是这样的,

solid ascii
  facet normal -6.343656e-001 -5.556834e-002 7.710334e-001
    outer loop
      vertex   4.893074e-001 8.750000e+000 2.695633e-001
      vertex   5.357143e-001 8.750000e+000 3.077444e-001
      vertex   5.077149e-001 8.785503e+000 2.872667e-001
    endloop
  endfacet
  facet normal -7.010786e-001 -9.853018e-002 7.062440e-001
    outer loop
      vertex   4.616061e-001 8.782279e+000 2.410454e-001
      vertex   5.077149e-001 8.785503e+000 2.872667e-001
      vertex   4.526215e-001 8.846208e+000 2.410454e-001
    endloop
  endfacet

我整个下午都在研究这个问题,但什么也没找到,这几乎让我发疯。

【问题讨论】:

  • 你的循环什么时候会中断? indexOf 如果找不到字符串,将返回 -1。 -1 计算结果为 true
  • 是的,你是对的,它会导致无限循环。我也不知道为什么会耗尽所有的内存。

标签: javascript node.js memory-leaks while-loop


【解决方案1】:

您的循环不会在任何情况下中断。当最后一个vertex 被处理时,如果没有找到任何东西,indexOf 返回-1。所以 offset 被设置为 -1 并且 while 循环无限地迭代。您只需要添加一个检查来比较 -1

while((offset = data.indexOf('vertex', ++offset))!=-1)

【讨论】:

  • 谢谢。我对js没有太多经验。我没有意识到 indexOf() 有不同的输出,当找到像 substr() 这样的其他编程语言返回 False 时。
  • 这里我也有一些困惑,虽然是无限的while循环,但随着while的进行,不应该耗尽更多的内存。应该只在函数中分配固定内存。
猜你喜欢
  • 1970-01-01
  • 2019-09-29
  • 2014-10-04
  • 2018-12-21
  • 2015-08-23
  • 2012-11-10
  • 2012-08-19
  • 2011-02-09
  • 2015-10-01
相关资源
最近更新 更多