Javascript 缓存a";“深”;使用guid作为键的JSON对象
因此,我有一个大而简单的对象,它是从JavaScript应用程序中的JSON文件加载的 此文件有大约9 MB的数据(但缩小后应该会更低),是一个嵌套结构,如下所示:Javascript 缓存a";“深”;使用guid作为键的JSON对象,javascript,json,caching,recursion,large-data,Javascript,Json,Caching,Recursion,Large Data,因此,我有一个大而简单的对象,它是从JavaScript应用程序中的JSON文件加载的 此文件有大约9 MB的数据(但缩小后应该会更低),是一个嵌套结构,如下所示: { "guid": "guid 1 here", "children": [ { "guid": "guid 2 here", "other": "properties", "here": true, "c
{
"guid": "guid 1 here",
"children": [
{
"guid": "guid 2 here",
"other": "properties",
"here": true,
"children": [
{
"guid": "guid 3 here",
...
},
...
]
},
...
]
}
我不知道该对象的深度,我需要使用一个通用函数,该函数根据节点的GUID属性定位节点,而不管节点在树中的深度如何。这个递归函数(我知道可以使用while循环而不是递归来优化它,但不管它有多昂贵)速度很慢
我想知道在加载这个对象之后,我是否会创建这样的缓存结构:
var cache = {
"guid 1 here": [reference to object],
"guid 2 here": [reference to object],
"guid 3 here": [reference to object]
};
我想,这会使寻找物体更快,因为我可以这么说
var node = cache[guid];
然而,这实际上会导致性能的提高,还是会导致内存问题?我从未处理过像cache
这样的变量,其中可能有数十万个属性
这会有助于还是阻碍这种局面
一如既往地感谢你们的建议,所以,你们真是太棒了。你们做出了正确的选择 对象引用相当小。即使有数千个对象,这样的对象(在内部存储为类似于散列映射的数组)也不会显著增加内存使用量——最多几MB。创建缓存时,您并不是在复制对象。将指针放入对象(数组样式),该对象指向已反序列化的结构中的对象。因此,您不会对所有数据进行第二次复制。只是GUID和指针的缓存 这个缓存方法使用了JavaScript的一个重要特性,即属性索引在内部保持排序。然后通过二进制搜索执行按属性索引(例如,
缓存[guid]
)进行的查找。这将比对未排序数据进行循环或递归搜索快几个数量级
然而,这是否真的会导致性能的提高
可能吧。拥有一个大的恒定访问数据结构(即使构建成本很高)通常比重复迭代所有“数十万”节点要快
但是,如果您可以优化递归查找函数(例如,通过从guid派生父节点的位置),这可能不会带来太大的好处
或者这可能会导致内存问题
是的,大型数据结构总是会在内存不足的设备上导致内存问题。但是,如果您的原始JSON数据没有任何问题,这应该不会是一个问题。OP没有为缓存使用数组?
[]
是一个对象运算符?您不是在谈论文字,而是查找运算符。@EdBayiates:不,数组在这里是无用的。GUID不是数组索引,即使它们是数组索引,那么数组也会非常稀疏(这不是一个好主意)。如果我使用数组,难道我不需要迭代每个项,直到找到具有所需GUID的项吗<代码>var结果;对于(var i=0;i