【问题标题】:Unique UserId check唯一用户 ID 检查
【发布时间】:2021-09-29 02:11:27
【问题描述】:

删除重复项以确保 UserId 唯一的最快方法是什么?大约有 3000 万个 userId 需要检查。

用法

const userIds = {}

const transform = csv.format({ headers: false }).transform((row) => {
      if (userIds[row.user_id]) {
       console.log(`Found Duplicate ${row.user_id}`);
       return false;
      } else {
        userIds[row.user_id] = 1
      }

      return row;
});

问题是脚本在大约 20 分钟后挂起。我正在从 CLI 运行脚本。

【问题讨论】:

  • 使用Set 可能会更高效。否则不清楚 csv 是什么(一个 NPM 包?)以及它是否打算在数百万行上运行。
  • 如果您不在乎哪个有重复项,那么您当前的解决方案看起来已经很不错了。我会删除console.log,因为如果它被称为一堆,它会大大减慢执行时间——与transform 中的其他操作相比,日志非常慢。
  • 通过this answerGet all unique values in a JavaScript array (remove duplicates),在性能方面也可能是一个不错的选择。
  • 只是出于好奇,在不检查对象是否有欺骗性的情况下遍历每一行需要多长时间?

标签: javascript node.js


【解决方案1】:

Set 对象的算法比数组的包含检查快得多。

const userIds = new Set()

const transform = csv.format({ headers: false }).transform((row) => {

      if (userIds.has(row.user_id)) {

         console.log(`Found Duplicate ${row.user_id}`);
         return false;

      } else {

          userIds.add(row.user_id)

      }

      return row;
});

【讨论】:

  • 或者只是userIds.add(row.user_id)没有if条件。
  • @AleksandrSmyshliaev 这是一个转换流。它必须返回 rowfalseuserIds 变量仅用于跟踪重复项。
  • 这种方法需要注意的一个问题:Sets have a limit of 2^24 items on some systems,包括 V8 引擎/Chrome(也就是略低于 1700 万条); 3000 万项可能无法正常工作,you'll get a RangeError
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-19
  • 2019-08-24
  • 2023-03-04
  • 2020-12-16
  • 2012-02-29
相关资源
最近更新 更多