2015-12-02 46 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

完美的作品,谢谢。 –