【发布时间】:2020-05-17 02:35:00
【问题描述】:
我正在尝试读取一些大型 CSV 文件并处理这些数据,因此处理中存在速率限制,因此我想在每个请求之间添加 1mnt 延迟。我尝试了设置超时,但最后,知道设置超时有限制并得到以下错误。我不确定任何其他方式来处理这种情况,CSV 文件有超过 1M 的记录。我在这里做错什么了吗?
错误
超时持续时间设置为 1。(节点:41) TimeoutOverflowWarning: 2241362000 不适合 32 位有符号整数。
示例代码:
const Queue = require('bull');
const domainQueue = new Queue(config.api.crawlerQ, {
redis: connectRedis(),
});
let ctr = 0;
function processCSV (name, fileName, options) {
return new Promise((resolve, reject) => {
console.log('process csv started', new Date());
let filePath = config.api.basePath + fileName;
stream = fs.createReadStream(filePath)
.on('error', (error) => {
// handle error
console.log('error processing csv');
reject(error);
})
.pipe(csv())
.on('data', async (row) => {
ctr++
increment(row, ctr)
})
.on('end', () => {
console.log('stream processCSV end', fileName, new Date());
resolve(filePath);
})
});
}
async function increment(raw, counter) {
setTimeout(async function(){
console.log('say i am inside a function', counter, new Date());
domainQueue.add(data, options); // Add jobs to queue - Here i Need a delay say 1mnt, if i
// add jobs without delay it will hit ratelimit
}, 60000 * counter);
}
function queueWorkerProcess(value) { // Process jobs in queue and save in text file
console.log('value', value, new Date());
return new Promise(resolve => {
resolve();
});
}
【问题讨论】:
-
我真的不知道你想在这里做什么。您在每个文件的每一行都调用
increment()。显然,60000 * counter的数字太大了。计时器似乎实际上并没有做任何有用的事情,所以我不知道你想用它来完成什么。 -
因此,此代码处理一个本地 CSV 文件。你想用它解决什么问题?您在哪里遇到速率限制问题?我在这段代码中看不到它。我们需要查看实际存在问题的真实代码,并且需要对实际问题进行完整描述。
-
是的,excel包含域名,我处理该文件的每一行并进行外部api调用,所以我希望每个请求之间有延迟,所以我曾经反击。见:borgs.cybrilla.com/tils/… 问题见:stackoverflow.com/questions/3468607/…
-
如果您展示您的实际代码以及您实际尝试做什么以及实际问题是什么,我可能会在大约 5 分钟内为您提供帮助。从字面上看,如果你展示了整个问题,我可以在几分钟内解决你的问题。但是,我拒绝写试图猜测你真正想要做什么的答案。到目前为止,您显示的代码实际存在的唯一问题是您试图创建一个太大的整数。删除此处没有实际用途的
setTimeout(),此代码没有问题。向我们展示您真正的问题和真正的代码。 -
我编辑了我的问题,我正在使用公牛队列作业,我希望在将作业添加到队列时延迟
标签: javascript node.js loops settimeout delay