从单个或多个大文件中排序和删除重复项

时间:2018-12-26 02:27:37

标签: merge mergesort

我有一个70GB的文件,其中包含4亿多行(JSON)。我的最终目标是删除重复的行,以便我拥有该文件的完全“重复数据删除”版本。我正在具有8cores和64gb ram的计算机上执行此操作。

我还在此线程'how to sort out duplicates from a massive list'上进行扩展。

我尝试过的事情:

  • Neek-javascript很快会耗尽内存
  • 使用Awk(似乎对此无效)
  • 使用Perl(perl -ne'打印,除非$ dup {$ _} ++;')-再次耗尽内存
    • sort -u largefile > targetfile 似乎不起作用。我认为文件太大。

当前方法:

  • 将文件分成500万行的块。
  • 对每个文件进行排序/ Uniq

for X in *; do sort -u --parallel=6 $X > sorted/s-$X; done

现在我有80个单独排序的文件。我正在尝试使用sort -m重新合并/删除它们。这似乎无能为力,因为文件/行大小最终都相同。

由于sort -m似乎不起作用,我目前正在尝试:

cat *.json | sort > big-sorted.json

然后我将尝试使用

uniq big-sorted.json > unique-sorted.json

根据过去的经验,我认为这不会奏效。

这里最好的方法是什么?我现在如何重新合并文件并删除任何重复的行。

更新1 我怀疑,猫* |排序> bigfile无效。它只是将所有内容复制到以前的排序方式(在单个文件中)到一个文件中。

更新2: 我还尝试了以下代码:

cat *.json | sort --parallel=6 -m > big-sorted.json

结果与先前的更新相同。 我没有想法。

谢谢!

1 个答案:

答案 0 :(得分:0)

经过反复试验,我找到了解决方法:

length