2017-06-21 124 views
1

我正在对Windows 7 64位操作系统中包含大量数据的数据库进行一堆调用。由于呼叫排队我的错误(第一个错误之后曾经HTTP调用):有人可以解释一个ENOBUFS错误吗?

Error: connect ENOBUFS *omitted* - Local (undefined:undefined) 

从我的谷歌搜索我已经学会了这个错误意味着我的缓冲区已经长得太大,我的系统内存不能再处理缓冲区的大小。

但我真的不明白这是什么意思。我使用node.js和HTTPS库来处理我的请求。当请求排队并且套接字打开时,缓冲区的大小是在RAM中分配的吗?什么可以让缓冲区扩大到更大的尺寸?这仅仅是一个硬件限制吗?

我也读过一些操作系统能够比其他操作系统更好地处理缓冲区的大小。是这样吗?如果是的话哪个操作系统更适合运行节点脚本,需要通过HTTPS请求获取很多的数据?

以下是我如何处理我的请求。

for (let j = 0; j < dataQueries; j++) { 
getData(function()) 
} 

function getData(callback){ 
axios.get(url, config) 
    .then((res) => { 
     // parse res 
     callback(parsedRes(res)) 
    }).catch(function(err) { 
     console.log("Spooky problem alert! : " + err); 
    }) 
} 

为了简洁,我省略了一些代码,但这通常是我如何处理我的请求。我有一个for循环,每次迭代都会通过axios启动GET请求。

我知道有一个axios.all命令用于存储axios.HTTPMethod给你的承诺,但是当我将它设置为存储承诺并通过承诺进行迭代时,我看到代码中没有任何更改axios.all

+0

可能我们可能会看到你的代码,我认为最好的办法会是某种queue –

+0

也看看https://stackoverflow.com/questions/10603860/very-simple-node-js-client-throws-error-enobufs-after-many-http-requests –

+0

@Jonasw添加了一个简短的代码片段,你能否将我链接到一个队列示例,或者给我一个想法来设置它? –

回答

1

感谢@Jonasw您的帮助,但有一个非常简单的解决这个问题。 我用小型图书馆throttled-queue完成工作。 (如果你看看源代码,这将是很容易在此基础上封装实现自己的队列

我的代码更改为:?

const throttledQueue = require('throttled-queue') 

let throttle = throttledQueue(15, 1000) // 15 times per second 

for (let j = 0; j < dataQueries; j++) {\ 
throttle(function(){ 
    getData(function(res){ 
    // do parsing 
    }) 
} 

} 

function getData(callback){ 
axios.get(url, config) 
    .then((res) => { 
     // parse res 
     callback(parsedRes(res)) 
    }).catch(function(err) { 
     console.log("Spooky problem alert! : " + err); 
    }) 
} 
+0

完美的是,这可以减慢足够的节点和我的后端处理HTTP请求...谢谢! – slashp

0

您同时启动大量数据查询。你可以把它们连起来使用部分递归函数,所以吗更有一个接着一个:

(function proceedwith(j) { 
    getData(function(){ 
    if(j<dataQueries-1) proceedwith(j+1); 
    }); 
})(0) 
相关问题