Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 缓存a";“深”;使用guid作为键的JSON对象_Javascript_Json_Caching_Recursion_Large Data - Fatal编程技术网

Javascript 缓存a";“深”;使用guid作为键的JSON对象

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

因此,我有一个大而简单的对象,它是从JavaScript应用程序中的JSON文件加载的

此文件有大约9 MB的数据(但缩小后应该会更低),是一个嵌套结构,如下所示:

{
    "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具有属性的对象是关联数组。很抱歉,上面的语法是正确的。所有JavaScript对象在内部存储为数组,这就是缓存[guid]工作的原因。我编辑了我的答案以更新术语。@EdBayiates:…一个没有顺序的关联数组,它会留下一个哈希映射。它们是否实现为数组并不重要<代码>缓存[guid]不是数组语法,而是对象属性访问。是。这就是在不增加大量内存的情况下获得最佳性能的方法。Bergi,他的缓存使用指针。不是数据的第二个副本。@EdBayiates:我不是说节点的副本吗?