节点为数组中的空值分配多少内存

Posted

技术标签:

【中文标题】节点为数组中的空值分配多少内存【英文标题】:how much memory does node allocate for null values in arrays 【发布时间】:2012-07-01 21:45:58 【问题描述】:

跟进这个话题:

Lots of null values in an array mean any harm?

我是用 node.js 做的:

arr=[]
arr[1000]=1
arr[1000000000]=2
arr.sort()

我得到了

FATAL ERROR: JS Allocation failed - process out of memory

所以这给我留下了一个问题(我在 Yahoogle 上找不到)实际上为 node.js 中的数组中的空条目分配了多少内存。我不打算使用 1000000000 个条目,甚至不接近,但也许仍然不值得分配内存......

谁知道我该如何检查?

【问题讨论】:

你的程序在 Node 0.6.2 中运行良好。 在我看来,这不依赖于 node.js,而仅依赖于运行 javascript 作为您引用的问题状态的 JavaScript 引擎的实现。 该数组包含undefined 值,而不是null 值。 另外值得注意的是,那些未初始化的数组条目不是null - 它们是undefined。这意味着它们不存在。它们实际上根本没有分配。 (哈哈喜欢@Eric sez。) 但是 node.js 不是自带引擎(V8)吗,你的 node.js 和我的(都是 0.6)应该是一样的。我错过了什么?有趣的是它不会对某些人失败...... 【参考方案1】:

编辑:抱歉不准确,可能不适用于 JAVA.. 对于在其他应用程序中需要它的人来说仍然可能会有所帮助。

一个引用数组正在分配 x

因此分配 arr[100000] 将分配 100 kb x 4b ~= 0.5Mb(近似值)

是的,当然,如果你不打算使用所有的数组, 您应该考虑一个 HashMap,它是一个专门用于此的数据结构.. HashMap 最适合具有较大的搜索范围和相对较少的项目。

无论哪种方式,都有一些解决方案可以分配一个小数组,并在需要时根据需要对其进行扩展。

【讨论】:

不,JavaScript 不像其他语言。数组没有预先分配。它们本质上哈希映射。 我考虑过哈希,但我仍然会使用整数作为键,我需要能够按键对它们进行排序(或者至少保持它们的顺序不变)并按顺序迭代它们。这听起来像是数组而不是哈希的工作,不是吗? @EasierSaidThanDone 您使用的是什么版本的 Node?该代码对我来说很好(0.6.12) " 但我仍然会使用整数作为键,我需要能够按键对它们进行排序(或至少保持它们的顺序不变)并按顺序迭代它们。“这很正常使用索引哈希。只需将每个键保存在大小为 [number_of_keys] 的数组中。对数组进行排序或在存储键时保持键的排序。同时构建您的键/值对哈希。【参考方案2】:

总而言之,node.js 不会为数组中未定义的值分配内存。 我所经历的崩溃一定是一个小故障,因为没有其他人可以重现它并安装最新的节点。 js 版本也为我解决了这个问题。

【讨论】:

以上是关于节点为数组中的空值分配多少内存的主要内容,如果未能解决你的问题,请参考以下文章

JOI:允许数组中的空值

去除数组中的空值

js中怎么去掉数组的空值,不知道是第几个,只要是空值就删除

如何序列化数组中的空值?

EXCEL函数去除数组中的0值和空值

php怎么去除数组中的空值