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