管理NodeJ中的内存

时间:2016-12-02 13:43:37

标签: javascript node.js

我用Node.js创建了一个脚本。当我在控制台中执行它时,它会打开并读取一个大文件并循环遍历该文件中的行。

问题是,为了读取文件,脚本会分配200MB的内存,但是为了遍历每一行,使用超过1.5 GB的内存

在代码中,我不会在数组或字符串中累积数据。所有代码都在一个循环中,任何变量都会在下一个循环中被覆盖。

如何减少内存使用量?如果问题出现在任何变量中,我积累数据,如何检测?

我没有共享代码,因为它是一个很大的脚本。我只需要解放内存或检测内存泄漏的方法。

修改

我不知道为什么用户删除他的aswer ... 这个解决方案适合我。是垃圾问题。如果我强制使用GC,那就行了!

  

node --expose-gc test.js

然后从Javascript中执行:

  

global.gc();

3 个答案:

答案 0 :(得分:1)

"所有代码都是一个循环"它意味着你将整个文件存储在内存中,对吗? 您可以尝试使用流方式并在时间读取1行。

var fs = require('fs');
var readline = require('readline');
var stream = require('stream');

var instream = fs.createReadStream('your/file');
var outstream = new stream;
var rl = readline.createInterface(instream, outstream);

rl.on('line', function(line) {
  // process line here
});

rl.on('close', function() {
  // do something on finish here
});

答案 1 :(得分:1)

您可以流式传输文件。阅读https://nodejs.org/api/fs.html#fs_class_fs_readstream。这将减少内存使用量。

答案 2 :(得分:1)

你有很多选择来检测Node中的内存泄漏,我认为最有用的是heapdump。

npm install heapdump --save

我可以随时在程序中编写堆的快照。例如,您可以使用以下命令在文件操作之前和期间执行转储:

heapdump.writeSnapshot(function(err, filename) {  
  console.log('dump written to', filename);
});

收集数据后,将其加载到chrome devTools中的探查器内,您就能看到哪些变量占用了内存。

作为替代方案,您可以按照excellent guide on the subject by felixge或此link提供一系列低级别工具,以防万一。“