2017-06-21 126 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) 
相關問題