【问题标题】:deduplicate multiple large files对多个大文件进行重复数据删除
【发布时间】:2016-05-13 19:01:16
【问题描述】:

我至少有 500 个包含单词的不同文件(每个单词在单独的行中)。问题是这些列表很长(总共 50 亿条记录),我无法让每个列表都独一无二。我想保留文件名,但同时在每个文件中都有唯一的条目(不合并等)。

到目前为止,我尝试了不同的程序,例如 app.merge 和 ccr,在表中具有唯一列的 DB(postgresql 和 sqlite),但没有运气。找不到可靠的解决方案。您对此有何建议?

编辑:我试图阻止任何文件包含常用词。为了更好地解释它,假设我有 3 个文件,内容如下:

f1:
word1
other
something

f2:
word2
word1
other

f3:
word1
something
myentry

结果我希望看到:

f1:
word1
other
something

f2:
word2

f3:
myentry

当然文件本身要大得多(以这个为例:http://md5decrypt.net/Telecharger-wordlist/Md5decrypt-awesome-wordlist.7z)。要回答“我到目前为止测试的内容”的问题 - 这是我现在正在处理的代码:https://pastebin.com/Y8HutakU,这是结果(运行 1 小时后停止):https://pastebin.com/tknve7qA。我知道代码远非最佳,并且在输出中清晰可见,随着 DB 的增长,下一次插入 DB 需要的时间越来越长。我正在尝试使用 DB,因为我认为这将是让所有单词唯一、保留文件名并具有比较方法以供将来使用(当我下载另一个单词列表进行比较等时)的好解决方案。此外,还有一些关于 SQLite 性能的好文章:

【问题讨论】:

  • 您是想防止任何两个文件有共同的单词,还是只是想确保每个文件中的单词在该文件中是唯一的?如果是后者,为什么有多少文件或总字数是多少?还有其他解决方案出了什么问题?
  • 我正在尝试防止任何文件包含常用词。
  • 那么每个文件中的所有单词都是唯一的吗?你认为一共有多少个不同的词?
  • 我担心它们不是独一无二的,但我可以用“sort | uniq”来制作它们。我不知道有多少字,但如果 500 个文件占用大约 100GB 的磁盘空间,那么也许我可以以某种方式估计它。 10 个字符作为一个平均单词 + '\n' 在每行的末尾等。
  • 使每个文件只有唯一的单词(vesche 的回答看起来可以解决问题),您的问题可能会变得更小。

标签: python postgresql sqlite word-list bigdata


【解决方案1】:

如果您使用的是 Linux 系统,则可以使用标准命令行工具。

for file in /path/to/files/*
do
    echo "`sort -u $file`" > $file
done

【讨论】:

  • 这不会解决问题。就像我在上面的评论中所说的那样 - 我试图防止任何文件包含常用词。按照您的想法,我将不得不使用 'uniq -d' 将所有重复项保存到单个文件中,然后使用该文件作为对其他文件进行重复数据删除的参考。尽管如此,这需要很长时间才能完成(已经尝试过),当我向该目录添加一两个文件时,很难称之为可靠的解决方案(整个过程必须重新开始)
  • 你应该更好地定义你的初始帖子,它说你想要“每个文件中的唯一条目”,这是我发布的解决方案。
猜你喜欢
  • 2016-12-23
  • 2017-12-08
  • 1970-01-01
  • 1970-01-01
  • 2018-12-13
  • 2016-08-29
  • 1970-01-01
  • 2019-06-02
  • 1970-01-01
相关资源
最近更新 更多