如何在非常大(65GB)的文本文件中找到重复的行?

如何在非常大(65GB)的文本文件中找到重复的行?

我有 10 个文本文件,每行包含 65 个十六进制值字符。每个文本文件大小为 6.5GB(有 99999999 行)

IEfile1-6.5GB, file2-6.5GB, file3-6.5GB, file4-6.5GB, ... file10-6.5GB

我需要在这 10 个文本文件中找到重复的行,并且我需要知道哪条重复行来自哪个文件以及有多少个文件有重复的行?

我怎样才能做到这一点?

我目前正在使用这个命令:

sort *.txt | uniq -d > dup

但它挂了,有时会崩溃。如果我想检查一个 65GB 的文件,我的计算机内存是否需要两倍于这个大小,即我需要安装更多内存吗?

还有其他方法可以做到这一点吗?

答案1

假设GNU 排序

sort不需要大于或等于处理文件大小的 RAM 量,它在处理过程中使用可用内存和临时文件对大文件进行批量排序。它非常高效,在直接从文件读取时无需用户干预。但是,当从管道或 STDIN 读取时,可能需要使用该选项设置缓冲区大小的值以提高--buffer-size=SIZE效率。

因此,您最有可能需要的是足够的磁盘空间,可以自由使用/tmp...如果磁盘空间不够,您可以尝试--compress-program=PROG以下选项PROG是要使用的压缩程序,如gzip。您需要指定它,并且它需要安装在您的系统上)在排序过程中压缩和解压缩临时文件,如下所示:

sort --compress-program=gzip *.txt | uniq -d > dupfile

崩溃很可能是由于并行使用的处理线程/进程超过了系统一次可以处理的量。您可以使用以下选项限制这种情况以减少系统--parallel=N负载(可以是从到的N数字。数字越低,处理速度越慢,但系统负载也会越低,并且崩溃将停止)18像这样:

sort --parallel=2 *.txt | uniq -d > dupfile

这两个选项也可以一起使用,如下所示:

sort --compress-program=gzip --parallel=2 *.txt | uniq -d > dupfile

或者,您可以分两步进行,首先逐个对文件进行预排序,然后使用--merge已排序文件上的选项来合并文件而不进行排序,如下所示:

sort --merge *.txt | uniq -d > dupfile

当然,你也可以使用这三个选项已预先分类文件来减少系统负载,如下所示:

sort --compress-program=gzip --parallel=2 --merge  *.txt | uniq -d > dupfile

了解哪些重复行来自哪个文件,您可以使用将整行视为固定字符串的选项,这应该会为您提供更高的性能,并且可以使用与整行完全匹配的选项,grep如下所示:-F-x

grep -Fx -f dupfile *.txt > resultfile

相关内容