节点为数组中的空值分配多少内存
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 版本也为我解决了这个问题。
【讨论】:
以上是关于节点为数组中的空值分配多少内存的主要内容,如果未能解决你的问题,请参考以下文章