我有两个大小为20Gb的文件。我必须在它们中搜索共同的字符串。假设字符串的最大长度为20字节。所以为了解决这个问题,我使用的是以下算法,我使用的是8GB RAM和四核i3 CPU系统。
sort the files using any suitable sorting utility
open files A and B for reading
read wordA from A
read wordB from B
while (A not EOF and B not EOF)
{
if (wordA < wordB)
read wordA from A
else if (wordA > wordB)
read wordB from B
else
/* match found, store it into some other files */
write wordA into output
read wordA from A
}
它成功地用于上述系统配置但是当我在6Gb RAM系统中运行此算法并且可用磁盘空间为120GB且具有6核i3处理器时......我的系统被多次关闭了。为什么会这样?
Plz告诉我任何其他方法来解决这个问题!我们可以改善它的表现吗?
答案 0 :(得分:3)
是的,您可以使用非常短的awk
1-liner
awk 'FNR==NR{a[$0]++;next}a[$0]' file1 file2
使用awk
,您可以找到唯一的行,而无需先对它们进行排序。你并没有真正说出你想用普通线做什么,所以我只是假设你想打印它们。
如果您只想打印一个公共行一次,无论重复多少次,您都可以使用:
awk 'FNR==NR{a[$0]=1;next}a[$0]-- > 0' file1 file2