【问题标题】:What's the fastest way to locate specific data in a large JSON?在大型 JSON 中定位特定数据的最快方法是什么?
【发布时间】:2019-11-19 09:53:35
【问题描述】:

我有一个 JSON,它可以包含超过一百万条记录(每条记录都是一个包含一些字段的简单对象,但得到它的层次结构包含大约 5 个级别)。我需要找到包含字段值的记录,最好是在 node.js 中以通用方式。

我尝试了jsonpath-plus,这正是我想要的。问题是处理这么多数据大约需要 25 秒(如果我只返回数据,不返回路径,则需要 10 秒)。

我尝试了json_query(这是 DOJO JSonQuery 对 node.js 的改编)。这工作非常快(1s),但只返回数据而不是数据的路径。

我想知道你是否能想到我可以使用的替代方案,或者我怎样才能让 jsonpath-plus 工作得更快。

澄清:我不生成数据。我无法控制它。我收到了完整的 JSON blob,然后我必须对其执行一些(大约 5 个)查询,然后才能获得一个新的。

真诚地, 埃拉德

【问题讨论】:

  • 这里的任何解决方案都只是主要问题的解决方法;数据权重。将一百万条记录的 JSON 文件作为实时数据存储真的不是一个好主意。我建议使用更好的更具可扩展性的解决方案,即。一个数据库。
  • 您绝对应该使用数据库来存储如此大量的数据。为这么大的 JSON blob 编写优化查询仍然需要对每个查询进行全面扫描。这就是数据库的价值;索引数据段。另一种方法是编写一个链式过滤器,在每个级别上键入一个特定值,这可能比 jsonpath-plus 提供的要慢。相比之下,即使是优化的 MongoDB 文档也开始滞后于第三级嵌套。
  • 澄清:我不生成数据,我收到它时无法控制它。我可以将它放在数据库中,但这样做会产生索引损失,并且我经常收到新数据(替换旧数据)(在我必须重新插入数据库之前,我只会做很少的查询)

标签: jquery node.js json


【解决方案1】:

澄清:我不生成数据。我无法控制它。

但是,您可以将其加载到数据库中并让它为您生成索引,并针对您需要的查询进行预优化。 (或者,您可以在自己的应用程序中构建这样的索引。)

我收到了完整的 JSON blob,然后我必须对它执行几个(大约 5 个)查询,然后才能得到一个新的。

您必须确定是否值得构建索引来运行这些查询。如果您只进行 5 次查询,并且它们需要对数据进行全面搜索,那么按照您现在的方式进行搜索可能会更快。

另一个想法……这个以行分隔的 JSON 是不是每条记录都是它自己的对象?如果是这样,您可以并行化此搜索。

【讨论】:

    【解决方案2】:

    我最终修改了 json_query 代码以返回路径。添加缓存使其工作速度更快(每个查询约 200 毫秒)。

    关于使用数据库的所有建议:
    我很清楚使用数据库的优点,但我认为对于我的特定用例,不值得麻烦。 我之前所说的大小是最坏的情况(到目前为止)。我通常希望有 50K 记录。即便如此,正如 json_query 包所展示的那样,对 1M 记录运行全面扫描对于现代计算机来说应该不是问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-01
      • 1970-01-01
      • 2020-10-16
      • 2016-11-30
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多