【问题标题】:Best way to store a huge list with hashes in Javascript在 Javascript 中存储带有哈希的巨大列表的最佳方法
【发布时间】:2011-11-23 11:01:09
【问题描述】:

我有一个包含 10.000 个条目的列表。

例如

myList = {};
myList[hashjh5j4h5j4h5j4]
myList[hashs54s5d4s5d4sd]
myList[hash5as465d45ad4d]
....

我不使用数组 (0,1,2,3),因为我可以检查 非常快
-> 这个哈希是否存在。

if(typeof myObject[hashjh5j4h5j4h5j4] == 'undefined')
{
  alert('it is new'); 
}
else
{
  alert('old stuff'); 
}

但我不确定,这是一个好的解决方案吗?
处理具有 10.000 个条目的对象是否有问题?

编辑:
我尝试构建一个仅显示新提要的 RSS 提要阅读器。所以我从链接计算哈希(每个新闻都有一个唯一的链接)并将其存储在对象(mongoDB)中。顺便说一句:10.000 个条目不是正常情况(但有可能)

【问题讨论】:

  • 请告诉我们您要完成的工作,因为它会影响您得到的建议。

标签: javascript list object


【解决方案1】:

我的建议:

  1. 为手头的任务使用尽可能小的哈希值。如果您要处理数百个可散列字符串(与数十亿个相比),那么您的散列长度可能会相对较小。
  2. 将哈希存储为整数,而不是字符串,以避免占用的空间少于所需空间。
  3. 不要存储为对象,只需将它们存储在一个简单的二叉树 log2(keySize) 深度。

进一步的想法:

  1. 你能用混合方法来解决这个问题吗?对不到一个月的最近提要使用哈希,并且不要费心显示超过一个月的项目。将哈希值和日期存储在一起,并每天清理旧的哈希值?

【讨论】:

  • 我无法在 MongoDb 中保存“二叉树日志”,但您的进一步想法很有趣。我必须(自己离开并)安静地思考这个问题。
【解决方案2】:

您可以使用in 运算符:

if ('hashjh5j4h5j4h5j4' in myList) { .. }

但是,这也会为对象原型链中的成员返回 true

Object.prototype.foo = function () {};
if ("foo" in myList) { /* will be true */ };

要解决此问题,您可以改用hasOwnProperty

if (myList.hasOwnProperty('hashjh5j4h5j4h5j4')) { .. }

虽然您自己可能没有向Object.prototype 添加方法,但您不能保证您使用的其他第三方库没有;顺便说一句,扩展Object.prototype 是不受欢迎的,所以你不应该真的这样做。 为什么?;因为你不应该修改你不拥有的东西。

【讨论】:

    【解决方案3】:

    10.000 相当多。您可以考虑将哈希值存储在数据库中并使用 ajax 进行查询。查询一个哈希可能需要更长的时间,但您的页面加载速度要快得多。

    【讨论】:

    • +1。这里的问题不会将10,000个对象存储在Object中,问题将是包含10,000个对象的页面的size,以及转移它们所花费的时间。
    • 可能哈希码会在客户端生成,不需要传输。
    【解决方案4】:

    在现代计算机上的现代浏览器中无论如何都不是问题。

    每个占用 50 字节的 10k 条目仍将占用少于 500KB 的内存。

    只要 js 以 gzip 格式提供服务,带宽就没有问题 - 但请尝试尽可能晚地提供数据,以免它们阻碍感知的页面加载性能。

    总而言之,除非您想迎合手机,否则您的解决方案就可以了。

    【讨论】:

    • 但如果有更好的方法来提高效率,那也无妨。
    • 是的,而且解决方案当然可以优化很多。然而,这种方法本身很好,现代浏览器处理一个对象上的 10k 个属性没有问题。
    猜你喜欢
    • 1970-01-01
    • 2014-04-21
    • 2011-09-22
    • 2019-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 2010-10-04
    相关资源
    最近更新 更多