javascript - 复制数组 --> 堆栈或堆溢出?

标签 javascript arrays node.js heap-memory

我有一个名为 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

另一种方法是在元素对之间交换 pricesizeissell 属性:

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/

相关文章:

javascript - 通过单击 MVC 4 中的 ActionLink 隐藏行

c - 指向二维数组元素的指针。我怎样才能将它传递给函数?

javascript - 如何创建定义长度的预填充数组?

javascript - 给定一个 jQuery,如何获取第一个结果元素?

javascript - 有没有办法在新窗口中从 blob 打开带有名称的 PDF

node.js - 在 redux 中处理权限

javascript - 我如何等到异步循环完成后才发送快速响应?

node.js - 如何发送二进制数据以响应 node.js 服务器

javascript - 如何在 Bootstrap 中重新排列垂直列?

PHP:我有一个带有时间范围的关联数组($k=>$v 整数),我想修剪和组合重叠的时间表