JVG*_*JVG 7 javascript memory-leaks memory-management mongodb node.js
我是这种javascript的新手,所以我将给出一个简短的解释:
我有一个内置的web scraper,Nodejs它收集(相当多)数据,处理它Cheerio(基本上是jQuery为了Node)创建一个对象,然后将其上传到mongoDB.
它工作得很好,除了在较大的网站上.什么是似乎要发生的事情是:
request模块获取页面源,然后将数据加载到Cheerio.正如我所说,这发生在成千上万的URL上,一旦我到达,比如,加载了10,000个url,我在节点中出现错误.最常见的是:
Node: Fatal JS Error: Process out of memory
Run Code Online (Sandbox Code Playgroud)
好的,这是实际的问题:
我认为这是因为Node的垃圾清理工作不正常.例如,request从所有40,000个URL中抓取的数据仍然可能存在于内存中,或者至少可以创建40,000个javascript对象.也许这也是因为MongoDB连接是在会话开始时进行的,并且永远不会关闭(我只需在完成所有产品后手动关闭脚本).这是为了避免每次登录新产品时打开/关闭连接.
要真正确保它们被正确清理(一旦产品进入MongoDB我不再使用它并且可以从内存中删除)可以/我应该只是简单地从内存中删除它,只需使用delete product?
Moreso(我显然不是JS如何处理对象)如果我删除一个对象的引用是它完全从内存中删除,还是我必须删除所有这些?
例如:
var saveToDB = require ('./mongoDBFunction.js');
function getData(link){
request(link, function(data){
var $ = cheerio.load(data);
createProduct($)
})
}
function createProduct($)
var product = {
a: 'asadf',
b: 'asdfsd'
// there's about 50 lines of data in here in the real products but this is for brevity
}
product.name = $('.selector').dostuffwithitinjquery('etc');
saveToDB(product);
}
// In mongoDBFunction.js
exports.saveToDB(item){
db.products.save(item, function(err){
console.log("Item was successfully saved!");
delete item; // Will this completely delete the item from memory?
})
}
Run Code Online (Sandbox Code Playgroud)
jfr*_*d00 11
delete在javascript中不用于删除变量或空闲内存.它仅用于从对象中删除属性.您可能会在操作员身上找到这篇文章delete.
您可以通过将变量设置为类似来删除对变量中保存的数据的引用null.如果没有其他对该数据的引用,那么这将使其符合垃圾收集的条件.如果有对该对象的其他引用,那么在没有对它的引用之前它将不会从内存中清除(例如,代码无法访问它).
至于导致内存累积的原因,有很多可能性,我们无法真正看到你的代码,知道可以保留哪些引用可以防止GC释放内容.
如果这是一个没有中断执行的单个长时间运行的进程,您可能还需要手动运行垃圾收集器以确保它有机会清理已释放的内容.
以下是关于在node.js中跟踪内存使用情况的几篇文章:http://dtrace.org/blogs/bmc/2012/05/05/debugging-node-js-memory-leaks/和https:// hacks .mozilla.org/2012/11/tracking-down-memory-leaks-in-node-js-a-node-js-holiday-season /.
| 归档时间: |
|
| 查看次数: |
7311 次 |
| 最近记录: |