我需要處理大量數據。對於數據的每個條目,我們需要向MySQL提交查詢。我目前的解決辦法是像如下:帶有承諾的批量模式javascript
var Q = require('q');
function process(entry){
...
var defered=Q.defer();
connection.query(sql,defered.makeNodeResolver());
return defered.promise;
}
function ProcessAll(results) {
var waitfor=[];
for(var i=0;i< results.length;i++){
waitfor.push(process(results[i]));
}
Q.all(waitfor).then(function(results) {
notifySuc(results);
},function(results){
notifyFail(results);
});
}
然而,當數據的數量是巨大的,它會因碰撞到了內存:
FATAL ERROR: Committing semi space failed. Allocation failed - process out of memory
1: node::Abort() [node]
2: 0x109624c [node]
3: v8::Utils::ReportApiFailure(char const*, char const*) [node]
4: v8::internal::V8::FatalProcessOutOfMemory(char const*, bool) [node]
5: v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [node]
6: v8::internal::Heap::CollectGarbage(v8::internal::GarbageCollector, char const*, char const*, v8::GCCallbackFlags) [node]
如何我小批量分手呢?例如,我們每次可以處理1000個條目。他們都是一個我們恢復其餘的。如何用回調函數做到這一點?
另外,我們可以讓多個條目並行處理嗎?
您確實需要多個查詢提交到數據庫?是不可能做出一個大的查詢,然後處理該查詢的結果? – hequ
'我們可以讓多個條目得到並行處理嗎? - 呃......它們是並行處理的(儘可能使用javascript)......你的代碼正在觸發儘可能多的'connection.query',因爲有元素在數組中.. –
我無法將多個查詢合併爲一個,因爲數據很大。如果我有100K條目,對於每個條目我需要寫1K字節的查詢,組合的100M查詢將太大而無法提交到數據庫。此外,分成小批量的主要目的,比如說每個1k,我只需要每次1K條目的內存,而不是一次加載所有100M。 –