节点在简单循环中耗尽内存

试图做一些地理空间性能压力testing。

我有以下代码(我不能–expose-gc grunt 问题,所以我不能调用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个多小时,因为我不能种子testing。

有谁知道我能做些什么来避免这种情况? (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]. 

您可以利用Property.create的asynchronous特性来允许GC在您的代码等待创buildlogging时发生。 在目前的forms下,您的代码将同步排队创build所有1Mlogging。

您可以通过向createRandomSeeds方法中添加一个callback参数来完成此操作,该方法在Property.create调用完成后调用,然后将同步for循环replaceforasynchronous迭代,如async库的while方法。

但是,我也build议不要在一个create调用中创build1000个文档。 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'); } );