2015-12-02 32 views
1

試圖做一些地理空間性能壓力測試。節點在簡單循環內存耗盡

我有以下代碼 (我不能--expose-gc grunt issue所以我不能調用global.gc())。

var getRandomRange = function(start, end){ 
     return parseFloat((Math.random() * (start - end) + end).toFixed(4)); 
    } 

    /* Max and min long and lat. 
    Latitude : max/min +90 to -90 
    Longitude : max/min +180 to -180 
    */ 
    var createRandomSeeds = function(index) 
    { 
     var createSeedsTestPropertyData = []; 
     for(var i = 0; i < 1000; i++) 
     { 
      createSeedsTestPropertyData.push({ 
       name:i.toString(), 
       location: [ 
        getRandomRange(+90, -90), getRandomRange(+180, -180) 
       ] 
      }); 
     } 

     //Mongoose create records. 
     Property.create(createSeedsTestPropertyData); 
     console.log('Created many records, ' + index); 
    } 

    for(var i = 0; i < 1000; i++) 
    { 
     createRandomSeeds(i); 
    } 

我假定節點會自動釋放內存。

現在我一直困在業餘時間超過2小時,因爲我不能種子測試。

有誰知道我能做些什麼來避免這種情況? (V4.2.1)

<--- Last few GCs ---> 

    31667 ms: Scavenge 1401.8 (1457.0) -> 1401.8 (1457.0) MB, 8.6/0 ms (+ 2.4 ms in 1 steps since last GC) [allocation failure] [incremental marking delaying mark-sweep]. 
    32749 ms: Mark-sweep 1401.8 (1457.0) -> 1401.8 (1456.0) MB, 1082.0/0 ms (+ 3.4 ms in 2 steps since start of marking, biggest step 2.4 ms) [last resort gc]. 
    33867 ms: Mark-sweep 1401.8 (1456.0) -> 1401.6 (1457.0) MB, 1118.0/0 ms [last resort gc]. 

回答

1

你可以採取的Property.create異步自然優勢,讓當你的代碼等待要創建的記錄發生GC。在目前的形式下,您的代碼會同步排隊創建所有1M記錄。

您可以通過添加一個callback參數,你說你叫當Property.create調用已完成,然後更換您的同步for循環與一個異步迭代像async庫的whilst方法createRandomSeeds方法做到這一點。

但我也建議不要在單個create調用中創建1000個文檔; 100可能是一個合理的最大值。所以請注意,下面的示例中的更改也如此:

var createRandomSeeds = function (index, callback) { 
    var createSeedsTestPropertyData = []; 
    for (var i = 0; i < 100; i++) { 
     createSeedsTestPropertyData.push({ 
      name: i.toString(), 
      location: [ 
       getRandomRange(+90, -90), getRandomRange(+180, -180) 
      ] 
     }); 
    } 

    Property.create(createSeedsTestPropertyData, function(err) { 
     console.log('Created many records, ' + index); 
     callback(err); 
    }); 
} 

var i = 0; 
async.whilst(
    // Keep looping asynchronously while i < 10000 
    function() { return i < 10000; }, 
    function (callback) { 
     i++; 
     createRandomSeeds(i, callback); 
    }, 
    function (err) { 
     console.log('All done'); 
    } 
); 
+0

完美的作品,謝謝。 –