gpt4 book ai didi

Javascript 内存消耗与大集合和回调上的 map()

转载 作者:行者123 更新时间:2023-12-02 16:59:37 25 4
gpt4 key购买 nike

我什至不知道如何正确提出这个问题,但我担心以下代码的性能(主要是内存消耗)。我预计这段代码将消耗大量内存,因为 map 位于一个大集合上,并且有许多等待外部服务的“挂起”函数。我的担忧是否合理?什么是更好的方法?

var list = fs.readFileSync('./mailinglist.txt') // say 1.000.000 records
.split("\n")
.map( processEntry );

var processEntry = function _processEntry(i){
i = i.split('\t');
getEmailBody( function(emailBody, name){
var msg = {
"message" : emailBody,
"name" : i[0]
}
request(msg, function reqCb(err, result){
...
});
}); // getEmailBody
}

var getEmailBody = function _getEmailBody(obj, cb){
// read email template from file;
// v() returns the correct form for person's name with web-based service
v(obj.name, function(v){
cb(obj, v)
});
}

最佳答案

如果您担心在很短的时间内提交一百万个 http 请求(您可能应该如此),则必须设置某种缓冲区。

一个简单的方法:

var lines = fs.readFileSync('./mailinglist.txt').split("\n");

var entryIdx = 0;
var done = false;

var processNextEntry = function () {
if (entryIdx < lines.length) {
processEntry(lines[entryIdx++]);
} else {
done = true;
}
};

var processEntry = function _processEntry(i){
i = i.split('\t');
getEmailBody( function(emailBody, name){
var msg = {
"message" : emailBody,
"name" : name
}
request(msg, function reqCb(err, result){
// ...
!done && processNextEntry();
});
}); // getEmailBody
}

// getEmailBody didn't change

// you set the ball rolling by calling processNextEntry n times,
// where n is a sensible number of http requests to have pending at once.

for (var i=0; i<10; i++) processNextEntry();

编辑:根据this blog post节点有一个内部队列系统,它只允许5个同时请求。但如果您担心内存消耗,您仍然可以使用此方法来避免用一百万个项目填充内部队列。

关于Javascript 内存消耗与大集合和回调上的 map(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25868015/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com