我有一个名为 globalArrayAllTrades
的数组,如下所示。我只是想反转数组的新副本中的日期。因此,我循环遍历,创建一个新对象并将其添加到新数组中 - 简单。
然后函数完全按照预期执行。但是,如果数组包含太多对象,则代码会失败并显示“ fatal error :CALL_AND_RETRY_LAST 分配失败 - 进程内存不足”。
我的笔记本电脑有 8 GB 内存...当 NODEJS 进程崩溃时,它使用大约 1.5 GB,并且使用了可用内存总量的大约 70%。
我确实使用参数运行 NODEJS 应用程序:--max_old_space_size=5000
这通常可以解决所有问题。但不是这个,我尝试了很多不同的方法来编码相同的函数 - 但每次 - 它都会失败......除非原始数组更小。
如何解决这个问题?
function invertTrades(){
var original = globalArrayAllTrades.slice();
globalArrayAllTrades.length = 0;
globalListAllTrades.length = 0;
for(var i = 0; i < original.length; i++){
var objS = original[i];
var objE = original[original.length-1-i];
var objInv = new TradePoint(objS.number, objS.matchdate, objE.price, objE.size, objE.issell);
globalArrayAllTrades.push(objInv);
globalListAllTrades[objInv.matchdate] = objInv;
}
}
最佳答案
您可以通过使原始文件仅包含需要反转的属性而不是整个 TradePoint
对象来节省一些内存。那么您不需要构造新的 TradePoint
对象,您可以就地修改它们。
var original = globalArrayAllTrades.map(function(trade) {
return {
trade.price,
trade.size,
trade.issell
};
}).reverse();
globalArrayAllTrades.forEach(function(trade, i) {
trade.price = original[i].price;
trade.size = original[i].size;
trade.issell = original[i].issell;
});
由于所有对象均已就地修改,因此无需更新 globalListAllTrades
。
另一种方法是在元素对之间交换 price
、size
和 issell
属性:
var midpoint = Math.floor(globalArrayAllTrade.length/2);
for (var i = 0; i < midpoint; i++) {
var objS = globalArrayAllTrades[i];
var objE = globalArrayAllTrades[globalArrayAllTrades.length-1-i];
var temp = objS.price;
objS.price = objE.price;
objE.price = temp;
temp = objS.size;
objS.size = objE.size;
objE.size = temp;
temp = objS.issell;
objS.issell = objE.issell;
objE.issell = temp;
}
关于javascript - 复制数组 --> 堆栈或堆溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40539138/