首页 > 解决方案 > 在节点js中使用.reduce和过滤100万个json数组是否正确?

问题描述

使用是否正确。减少和。在节点 js 中过滤100 万个 json 数组?我正在使用JSONStream来解析它。但是我需要找到重复和唯一的记录,并且必须对每条记录进行一些按摩,还必须比较两个 100 万的 json 数组。解决这个问题的最佳方法是什么?性能不是限制,它只是后台工作。计划使用计划任务部署此作业 aws ECS。我打算在下面做这样的事情

                 var values = [
 { name: "a", age: 15 },
 { name: "a", age: 17 },
  { name: "a", age: 17 },
 { name: "b", age: 18 },
 { name: "c", age: 18 },
  { name: "d", age: 18 },
    { name: "c", age: 18 },
];
 
const lookup = values.reduce((a, e) => {
  a[e.name] = ++a[e.name] || 0;
  return a;
}, {});

console.log("Name count",lookup)

var unique =[];
var dup = values.filter(e => {
    if(lookup[e.name]){
      return lookup[e.name];
    }else {
      unique.push(e)
    }
});

console.log("Unique:",unique);
console.log("Duplicate", dup)

标签: javascriptarraysnode.jsperformancememory-management

解决方案


如果您想知道这是否适用于一百万个记录数组,那么您只需在您的系统和环境中运行它即可查看。这不是一个人可以只看代码并“知道”的事情。你必须进行实验。

我不得不说,我开始认为一百万条记录数据集可能最好在数据库中进行管理。如果将所有这些都放在数据库中,那么您可以构建将数据放入数据库的方式,以便更轻松地查询具有给定名称或年龄的所有记录,或者具有唯一名称或非唯一的名称。这就是构建数据库的目的。

我可以看到一种可能会加快速度的方法。您可以构建lookup,uniquedup使用更少的名称查找。如果在构建lookup数据结构时,您还只是跟踪具有该特定名称的所有项目,那么您可以看到哪些项目最终只有一个项目的名称。因此,与其遍历所有数据并查找每个名称,您只需遍历查找数据结构并查看哪些名称的 cnt1或大于1.

我个人也喜欢使用Map对象进行查找,因为它就是为此而构建的,但是由于您的键是字符串,因此您的对象可能也可以正常工作。无论如何,这是一个稍微调整的版本:

var values = [
    { name: "a", age: 15 },
    { name: "a", age: 17 },
    { name: "a", age: 17 },
    { name: "b", age: 18 },
    { name: "c", age: 18 },
    { name: "d", age: 18 },
    { name: "c", age: 18 },
];

const lookup = new Map();
const unique = [];
const dup = [];

for (let item of values) {
    let array = lookup.get(item.name);
    if (!array) {
        // if we don't have this name yet, add it to the Map as a one element array
        lookup.set(item.name, [item]);
    } else {
        // otherwise, just push this item into the array
        array.push(item);
    }
}

// To find unique and dup, we can just iterate the Map and 
// look at the length of each array
for (let [name, array] of lookup) {
    if (array.length === 1) {
        unique.push(array[0]);
    } else {
        dup.push(...array);
    }
}

console.log("Name count", lookup);
console.log("Unique:", unique);
console.log("Duplicate", dup);

values数据结构并不是存储一百万条具有相同两个属性的记录的最有效方式。解释器可能会识别内部重复并为您优化它,但它可能可以更有效地存储为:

const values = [
    [ "a", 15 ],
    [ "a", 17 ],
    [ "a", 17 ],
    [ "b", 18 ],
    [ "c", 18 ],
    [ "d", 18 ],
    [ "c", 18 ],
];

或者,甚至只是:

const values = [
    "a", 15,
    "a", 17,
    "a", 17,
    "b", 18,
    "c", 18,
    "d", 18,
    "c", 18,
];

其中代码有一些关于如何获取每个单独项目的预先构建的知识。如果内存使用率太高,您可以考虑这样的优化。


推荐阅读