【发布时间】: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