【问题标题】:How to find unique entries in Large data set?如何在大数据集中找到唯一条目?
【发布时间】:2009-01-06 18:03:37
【问题描述】:

我有1亿行数据,数据是一个不超过15个字符的单词,每行一个单词。这些数据存储在多个文件中。

我的目标是在所有文件中找到唯一的单词。

一种解决方案是将所有单词导入数据库并为字段添加唯一键。但这对于这个大数据集来说太慢了。

有没有更快的解决方案?

谢谢

【问题讨论】:

    标签: data-structures


    【解决方案1】:

    我不确定是否会有比使用数据库更快的方法。就个人而言,我通常为此使用 UNIX shell 脚本:

    cat * | sort | uniq
    

    我不知道 100,000,000 字的速度会有多快,我也不确定你希望它有多快。 (例如,你需要运行很多次还是只运行一次?如果只运行一次,我会选择 sort 和 uniq 选项,如果可以的话让它运行一夜)。

    或者,您可以使用 ruby​​ 或类似语言编写脚本,将单词存储在关联数组中。我怀疑这几乎肯定会比数据库方法慢。

    我想如果你真的想要速度,并且你需要经常执行这个任务(或类似的任务),那么你可能想用 C 写一些东西,但对我来说这感觉有点矫枉过正。

    【讨论】:

    • 如果您决定使用 sort 命令,请考虑先使用 sort -u(表示唯一)对文件进行单独排序,然后使用 sort -um 将它们合并在一起(删除文件之间的重复项)。当文件很大时,这会有所帮助。此外,使用 ls -fA 和 xargs -I 可以帮助简化此操作。
    【解决方案2】:

    为此使用数据库太疯狂了。 15 个字符的 1 亿条记录适合 ram。如果至少有一些重复,只需构建一个 trie。应该能够在现代机器上处理 50MB/秒左右

    【讨论】:

      【解决方案3】:

      如果您必须坚持使用文件结构,那么您需要某种方法来索引文件,然后维护索引。

      否则,我建议移动到数据库并迁移对该文件的所有操作以使用该数据库。

      【讨论】:

        【解决方案4】:

        您可以将单词存储在哈希表中。假设有相当多的重复项,O(1) 的搜索时间将大大提高性能。

        1. 读一行。
        2. 在哈希表中搜索单词。
        3. 如果未找到,请将其添加到表中。

        【讨论】:

          【解决方案5】:

          如果您有这么多数据,那么它需要在 SQL 服务器中。这就是最初设计 SQL 的原因。如果您继续使用这些文件,您将永远陷入性能问题。

          即使这些文件是从外部程序(或通过 FTP)修改的,您也需要创建一个导入过程以在夜间运行。

          【讨论】:

          • 错误。 SQL 经过优化,可以轻松读取表和关系。在这个问题上没有什么类似的。如果这种处理是经常性的,最好使用专门构建的 DB(可能在 BDB 之上)。如果是一次性的,请使用 sort|uniq
          【解决方案6】:

          您可以节省速度、空间或理智。选择任意两个。

          正如您所发现的,将其全部放入数据库会牺牲速度和空间。但这很容易。

          如果空间是您的主要问题(内存、磁盘空间),则对工作进行分区。从文件中过滤所有 1 个字符行并使用上述解决方案之一(排序、uniq)。对每个文件重复 2 个字符行。等等。每次传递的独特解决方案构成您的解决方案集。

          如果您的主要问题是速度,则在创建哈希表(字典等)后准确读取每个文件以查找重复项。根据散列实现,这可能会消耗大量内存(或磁盘)。但它会很快。

          如果您需要节省速度和空间,请考虑混合使用这两种技术。但要做好牺牲第三项的准备。

          【讨论】:

            【解决方案7】:

            如果单个文件中存在大量重复,则逐个文件执行然后合并结果可能会更快。大致如下:

            { for n in * ; do sort -u $n ; done } | sort -u
            

            (我假设 GNU bash 和 GNU 排序)

            我认为最佳解决方案的选择在很大程度上取决于重复文件的分布和单独文件的数量,但您尚未与我们共享这些文件。


            鉴于 myhusky 的澄清(大量的骗子,10~20 个文件),我肯定会建议这是一个很好的解决方案。特别是,密集复制将加速 sort -usort|uniq

            【讨论】:

            • 重复很重,文件数在10~20左右
            • 听起来这个可能只是比@Ben 的运行速度快一点。你试过了吗?如果欺骗很重,我认为 sort -u 会比 sort|uniq 运行得快很多。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-12-03
            • 1970-01-01
            • 1970-01-01
            • 2021-06-21
            相关资源
            最近更新 更多