【问题标题】:Pushing "undefined" on an array consumes tons of memory?在数组上推送“未定义”会消耗大量内存?
【发布时间】:2018-05-26 01:59:25
【问题描述】:

我有一个奇怪的错误,它占用了大量内存并不断导致我的服务器崩溃。

每 30 秒我将一个值保存到一个数组中:

historicalValues.push( valueToSave ) 

当 valueToSave = 1 时,应用程序不会因此而大幅增加内存。

但是当 valueToSave = undefined 或 null 时,应用程序突然在 2 分钟内增加了 90 MB?

有人知道是什么原因造成的吗?我很确定空变量不会比数字占用更多的内存。它是否与它强制数组必须切换到效率较低的对象类型才能支持多种不同类型的对象的条目有关?以为javascript不关心这样的东西。

【问题讨论】:

  • it forces the array to have to switch to a less efficient object type to be able to support entries of multiple different types of objects? Thought javascript didn't care about stuff like that. 你会感到惊讶:v8project.blogspot.com.au/2017/09/elements-kinds-in-v8.html
  • 内存消耗是否保持以这种速度增加,还是一次性的?
  • 是什么让你认为 2 分钟内的内存增加来自 4 次数组推送操作?如果检查并将undefined或null替换为1,是否不会发生内存增加?
  • 为什么服务器会因使用 90 mb 而崩溃?

标签: javascript arrays node.js memory undefined


【解决方案1】:

每当您在 Array 中混合类型时,它都会增加内存,无论它是 undefinednull 还是其他类型。那是因为你正面临着那个。

如果您不需要这些值,只需在推送之前过滤它们。

如果您确实需要这些值,只需将这些值转换为整数即可。

如果你有一个整数数组,但还需要使用undefinednull作为可能的值,请在推送之前检查它们,如果它们是undefinednull,则推送整数0。

由于 undefinednull 评估为 false,您可以按以下方式访问它:

if(!value) {
   array.push(0)
} else {
   array.push(value)
}

[12,20,30,0,32,0,0,5]

【讨论】:

    猜你喜欢
    • 2022-12-06
    • 2022-01-16
    • 2014-01-04
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    相关资源
    最近更新 更多