【发布时间】:2009-01-06 18:03:37
【问题描述】:
我有1亿行数据,数据是一个不超过15个字符的单词,每行一个单词。这些数据存储在多个文件中。
我的目标是在所有文件中找到唯一的单词。
一种解决方案是将所有单词导入数据库并为字段添加唯一键。但这对于这个大数据集来说太慢了。
有没有更快的解决方案?
谢谢
【问题讨论】:
标签: data-structures
我有1亿行数据,数据是一个不超过15个字符的单词,每行一个单词。这些数据存储在多个文件中。
我的目标是在所有文件中找到唯一的单词。
一种解决方案是将所有单词导入数据库并为字段添加唯一键。但这对于这个大数据集来说太慢了。
有没有更快的解决方案?
谢谢
【问题讨论】:
标签: data-structures
我不确定是否会有比使用数据库更快的方法。就个人而言,我通常为此使用 UNIX shell 脚本:
cat * | sort | uniq
我不知道 100,000,000 字的速度会有多快,我也不确定你希望它有多快。 (例如,你需要运行很多次还是只运行一次?如果只运行一次,我会选择 sort 和 uniq 选项,如果可以的话让它运行一夜)。
或者,您可以使用 ruby 或类似语言编写脚本,将单词存储在关联数组中。我怀疑这几乎肯定会比数据库方法慢。
我想如果你真的想要速度,并且你需要经常执行这个任务(或类似的任务),那么你可能想用 C 写一些东西,但对我来说这感觉有点矫枉过正。
本
【讨论】:
为此使用数据库太疯狂了。 15 个字符的 1 亿条记录适合 ram。如果至少有一些重复,只需构建一个 trie。应该能够在现代机器上处理 50MB/秒左右
【讨论】:
如果您必须坚持使用文件结构,那么您需要某种方法来索引文件,然后维护索引。
否则,我建议移动到数据库并迁移对该文件的所有操作以使用该数据库。
【讨论】:
您可以将单词存储在哈希表中。假设有相当多的重复项,O(1) 的搜索时间将大大提高性能。
【讨论】:
如果您有这么多数据,那么它需要在 SQL 服务器中。这就是最初设计 SQL 的原因。如果您继续使用这些文件,您将永远陷入性能问题。
即使这些文件是从外部程序(或通过 FTP)修改的,您也需要创建一个导入过程以在夜间运行。
【讨论】:
您可以节省速度、空间或理智。选择任意两个。
正如您所发现的,将其全部放入数据库会牺牲速度和空间。但这很容易。
如果空间是您的主要问题(内存、磁盘空间),则对工作进行分区。从文件中过滤所有 1 个字符行并使用上述解决方案之一(排序、uniq)。对每个文件重复 2 个字符行。等等。每次传递的独特解决方案构成您的解决方案集。
如果您的主要问题是速度,则在创建哈希表(字典等)后准确读取每个文件以查找重复项。根据散列实现,这可能会消耗大量内存(或磁盘)。但它会很快。
如果您需要节省速度和空间,请考虑混合使用这两种技术。但要做好牺牲第三项的准备。
【讨论】:
如果单个文件中存在大量重复,则逐个文件执行然后合并结果可能会更快。大致如下:
{ for n in * ; do sort -u $n ; done } | sort -u
(我假设 GNU bash 和 GNU 排序)
我认为最佳解决方案的选择在很大程度上取决于重复文件的分布和单独文件的数量,但您尚未与我们共享这些文件。
鉴于 myhusky 的澄清(大量的骗子,10~20 个文件),我肯定会建议这是一个很好的解决方案。特别是,密集复制将加速 sort -u 与 sort|uniq
【讨论】: