我为我使用的API提供了一个速率限制器,它每秒允许20个请求。所有请求均基于承诺,并且一旦有响应,承诺将使用API数据进行解析。
问题:
我设置了一个promiseArray,其中包含58k个都在等待响应的Promise。如此缓慢地增加内存,直到内存用完。在我的特定情况下,我不需要将解析的数据传递给我then()
,并且数据耗尽了我所有的RAM。
编码:
}).then(() => {
// 2. Crawl for all clanprofiles from these leaderboards
const promiseArray = []
for (let i = 0; i < clanTags.length; i++) {
// Resolved data from getClanProfile() is eating up all my RAM
const p = backgroundScheduler.getClanProfile(clanTags[i], true)
promiseArray.push(p)
}
return Promise.all(promiseArray)
}).then(() => {
那么,有没有一种方法可以等待到promiseArray被解析而不需要解析的数据呢?
如果您没有58k的诺言,它们关联的异步操作和它们的结果数据一次都处于活动状态,则将使用较少的内存。
相反,您想一次运行X次操作,然后在一次操作完成时,就开始下一个操作,一次不超过X个,一次不超过X个承诺。
您可以尝试使用适当的X值。值为1表示顺序操作,但通常可以通过使用更高的X值来改善端到端的总体操作时间。如果所有请求都到达同一主机,则X为可能不会超过5到10个(因为给定的主机不能一次真正完成很多事情,要求它立即完成很多事情,只会减慢速度)。
如果每个请求都针对不同的主机,则可以提高X。实验将为您提供峰值内存使用量和总体吞吐量的最佳值,并且在某种程度上取决于您的具体情况。
Bluebird’sPromise.map()
有一个并发选项可以为您做到这一点,但是也有很多方法可以同时为飞行中的X进行编码。
如果不需要解析的数据,则可以通过如下替换它来使其尽快被GC化:
const p = backgroundScheduler.getClanProfile(clanTags[i], true).then(data => {
return 0; // make resolved value just be a simple number
// so other data is now eligible for GC
});
promiseArray.push(p)
而且,这是一个简单的实现,它可以同时迭代一个数组,且该数组中的飞行请求不得超过X个:
// takes an array of items and a function that returns a promise
// runs no more than maxConcurrent requests at once
function mapConcurrent(items, maxConcurrent, fn) {
let index = 0;
let inFlightCntr = 0;
let doneCntr = 0;
let results = new Array(items.length);
let stop = false;
return new Promise(function(resolve, reject) {
function runNext() {
let i = index;
++inFlightCntr;
fn(items[index], index++).then(function(val) {
++doneCntr;
--inFlightCntr;
results[i] = val;
run();
}, function(err) {
// set flag so we don't launch any more requests
stop = true;
reject(err);
});
}
function run() {
// launch as many as we're allowed to
while (!stop && inFlightCntr < maxConcurrent && index < items.length) {
runNext();
}
// if all are done, then resolve parent promise with results
if (doneCntr === items.length) {
resolve(results);
}
}
run();
});
}
我们最近将我们的银行应用程序从Java1.6升级到1.8,并将JBoss4.x升级到WildFly10.1。 我们观察到java消耗了机器上可用的所有内核(10)。 有人能说出是什么原因吗,在JBoss4.x中,通常最大CPU利用率是4个核心。 下面是(添加到消耗高cpu的进程上)的结果 pS-elo pid,lwp,nlwp,ruser,pcpu,stime,etime,argsgrep 363
我写了一个Kafka消费者从主题中获取所有记录,然后只进入下一步,但它没有获取所有记录。
问题内容: 我正在开发一个Laravel 4应用,该应用将通过JSON REST API和Web UI对数据集进行相同的CRUD操作。为了防止违反DRY原则,我的UI应该通过将所有请求从UI路由回API来使用我自己的API。我不确定如何使这项工作的最佳方法。大概我将拥有单独的UI和API控制器,并以某种方式路由请求。还是我应该完全采用另一种方法? 谢谢。 问题答案: 我实际上是在修改相同的想法,而
Android Studio在Mac机上消耗了太多的内存,并且还运行了多java进程。 Android Studio版本:使用Android Studio北极狐2020.3.1(补丁1构建#AI-203.7717.56.2031.7621141,构建于2021年8月7日) 当我面临内存不足的问题时,我正在监视Android Studio的内存消耗,我注意到多个“Java”进程正在运行,甚至一个进程
ANTLR愉快地将所有的表达解析成成分,听者作用于相关的成分,生活是快乐的。下面是语法的一个代表性片段: 但现在,我需要扩展语法以合并两个新表达式,这两个表达式都以接受任何字符序列(包括Unicode)结束,直到。示例输入: 我很难在语法中表达对的所有输入的接受。以下变化导致痛苦: 如何才能做到这一点?期望的结果是,解析树侦听器将获得文本值,如。 我尝试将写入单独的和中,但遇到https://gi
我必须记录消费者在SpringKafka中花费的时间。由于kafkaListener方法对每条消息都执行,因此在那里放置一个记录器是行不通的。此外,有时一些信息会丢失,而不是被消费者消费掉。我应该把记录器放在哪里,以找出消费者启动后的弹性时间。使用者不会退出或关闭,其轮询将无限期进行