我用Node.js创建了一个脚本。当我在控制台中执行它时,它会打开并读取一个大文件并循环遍历该文件中的行。
问题是,为了读取文件,脚本会分配200MB的内存,但是为了遍历每一行,使用超过1.5 GB的内存
在代码中,我不会在数组或字符串中累积数据。所有代码都在一个循环中,任何变量都会在下一个循环中被覆盖。
如何减少内存使用量?如果问题出现在任何变量中,我积累数据,如何检测?
我没有共享代码,因为它是一个很大的脚本。我只需要解放内存或检测内存泄漏的方法。
修改
我不知道为什么用户删除他的aswer ... 这个解决方案适合我。是垃圾问题。如果我强制使用GC,那就行了!
node --expose-gc test.js
然后从Javascript中执行:
global.gc();
答案 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提供一系列低级别工具,以防万一。“