【发布时间】:2014-01-29 19:28:53
【问题描述】:
我正在做一些 javascript 3D 处理,我有大量的对象(比如对象 A),每个对象都包含一些东西和一个正整数数组,例如 [0, 1, 4], [ 1, 5, 74, 1013]等。它们不需要有私有值,所有对象都可以共享同一个列表。 这些数字可以从 0 到几千,比如 65k(短)。
分析显示这些数组正在消耗大量内存。在计算时,我的程序达到了超过 2GB 的分配内存,这不是愚蠢的预优化。
我有 2 条内存优化线索:
- 找到一种更节省内存的方法来存储这些列表(也许是大数字的位数组?)
- 想办法避免重复。例如,我碰巧发现一些数组(如 [0,1,2,3,4,5,6])存在于 40 000 多个对象 A 中。也许将这些数组存储在树结构中并制作我的对象指出它会有帮助吗?
您有什么建议吗?
编辑:我忘了提及它,但它很重要:列表中的每个整数都是唯一的。 EDIT2:唯一要检索的是整数 SET,顺序并不重要。
我正在考虑使用按位运算将这些数组转换为“大整数”,即创建一个具有某个类的大整数,设置位 1、5、74、1013,将大 int 转换为字符串(数组8 个字节)并存储字符串,但并不总是有好处(例如,数组 [4000] 将表示为 500 字节长的字符串...)
项目范围(没用,但有人问过我)
这应该是没用的,但我被问过好几次了,我把它放在这里。
我正在构建一个体积物体的 3D 网格,为了简化,我们假设我有很多球体。我知道它们的位置(中心、射线),我想在单个 3D 网格中绘制它们。为此,我有一个名为Octree 的内存结构,它允许我在对象表面周围的较低单元(八叉树节点)中划分 3D 空间。然后我可以从这些单元格构建一个网格。
那些细胞就是我在描述中所说的对象 A。每个单元格包含一个 id 列表(正整数),它指向单元格相交的 Sphere 对象。
事实上,分析表明这些单元阵列在内存中保留了数百 MB。我想减少这个数字,方法是找到一种方法来删除所有重复项和/或如果可能的话,找到一种更有效的方法来存储正 ID 列表(可以从 0 到 65k)。
【问题讨论】:
-
也许你可以用 dups 原样存储数组,然后记住所有可能使用数组计算的函数。 JS 中的大数组通常不是问题,您会发现与它们交互的方法会导致性能差异。
-
我的建议是发布您的代码,以便我们能够真正看到问题所在。不知道你的问题是基于上述...
-
我实际上无法发布数千行代码...我什至不知道从哪里开始将这个问题减少到 SO 上的几行...
-
您确定您提到的 2GB 仅来自您的整数列表吗?因为这意味着你有超过十亿个数字(你说它们是空头,如果它们是常规整数,你仍然需要十亿个数字)。那是很多数字。也许您将纹理存储在某个地方,这会占用大量内存....
-
不管怎样,看看this SO question。这是关于 OpenGL 中的顶点数组,但基本原理与您尝试做的相同。那里提到的优化也可以应用于您的情况。
标签: javascript arrays optimization integer