如何在巨大的 json 文件之间执行最佳模式搜索?

Posted

技术标签:

【中文标题】如何在巨大的 json 文件之间执行最佳模式搜索?【英文标题】:How to perform optimal pattern search between huge json files? 【发布时间】:2021-01-11 19:19:01 【问题描述】:

寻找在 JSON 文件之间执行模式搜索的解决方案,该解决方案可以遍历巨大的 JSON 文件而不会对性能产生太大影响。以下是几个测试用例。

搜索条件


    “cabin_1”与“cabin_1”匹配 “cabin_3”与“cabin 3”或“3cabin”匹配 “第一舱”与“第一舱”匹配

测试用例文件


你可以找到测试json文件here

我的想法


for each json1Property in json1
     for each json2Property in json2
        isMatch = regex('somepattern', json1property , json2property)
        if (isMatch) 
           return true 
        else 
           return false

【问题讨论】:

您没有添加 JSON 文件,现在很难想出没有它的解决方案。另外,我认为你对你的期望不是很准确。你只想得到一个布尔值是否符合你的匹配规则? @sjahan json 文件在测试用例文件头中。为了简单起见,只需匹配并返回 true 或 false 就足够了。我正在寻找更好的算法,而不仅仅是循环和比较每个属性 所以你想比较每个space,看看它们是否包含匹配项,对吧?我不确定我是否完全理解您的搜索条件:列表是否详尽且明确?第五条规则的意义何在? “cabin_2”必须与“cabin2”匹配,但“cabin_1”是与“cabin1”匹配还是仅与“cabin_1”匹配? 是的,cabine_1 应该匹配cabin1 【参考方案1】:

这是相当基本的,我不是算法专家,但基本上,目标是为每个数组构建一个简单的索引。您简化并将值映射到更容易/更快的东西以便以后比较。我认为一种或另一种方式,你必须迭代数组。

在这里,您在每个数组上迭代一次以构建索引,而在您的第一次尝试中,您有一个双循环。

双循环在第二阶段有点存在,将索引与filter/includes进行比较,但我认为它会更轻,因为数组的长度减少了,数据更容易检查。

const data = 
  "Building": 
    "floor": [
      
        "space": [
          "cabin_1",
          "cabin_2",
          "cabin_3",
          "mycabin"
        ]
      ,
      
        "space": [
          "first cabin",
          "xyz's cabin",
          "Zone c",
          "Zone d"
        ]
      
    ]
  
;
const spaces = data.Building.floor;

const indices = spaces.reduce((acc, item) => 
  acc.push(item.space.map(it => 
    return it.replace(/ ?cabin[_ ]?/g, '') //Remove cabin, trailing spaces and underscores.
    .replace(/1st|first/g, '1') //Map things that are not numbers to numbers.
    .replace(/2nd|second/g, '2')
    .replace(/3rd|third/g, '3');
  ).filter(it => !isNaN(it))); //Removes every thing that is not processed by the index engine.
  return acc;
, []);
console.log(indices);

let shorterArray, longerArray;
if(indices[0].length > indices[1].length) 
  shorterArray = indices[1];
  longerArray = indices[0];
 else 
  shorterArray = indices[0];
  longerArray = indices[1];


const sharedItems = shorterArray.filter(it => longerArray.includes(it));
console.log('Shared items found', !!sharedItems.length, sharedItems);

【讨论】:

以上是关于如何在巨大的 json 文件之间执行最佳模式搜索?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Javascript或JQuery搜索巨大的JSON

如何搜索非常大的 json 文件?

在 WebApp 中创建和下载巨大 ZIP(来自多个 BLOB)的最佳实践

映射器执行时间之间的巨大差异

VS2005 调试模式和发布模式之间的巨大性能影响

MSSQL · 最佳实践 · 利用文件组实现冷热数据隔离备份方案