如何高效将两个已排序大文件合并为单个有序去重的独立文件
两个已排序超大文件的高效合并方案
直接用Linux系统内置的sort命令原生支持的有序合并能力即可,无需额外开发或安装工具,是目前性能最优的方案:
sort -mu 已排序文件1 已排序文件2 > 合并后有序去重文件
参数说明
-m:该参数专门用于合并多个已经提前排好序的输入文件,不会触发全量重排序逻辑,仅采用归并算法线性扫描两个文件逐行比对输出,时间复杂度为O(n),完美适配你的十亿行级超大文件场景,全程不会消耗多余的排序算力-u:自动去重,遇到两个文件中重复的行仅保留1个,直接满足全局唯一的要求
和原方案的性能差异
你最初考虑的先合并文件再执行sort -u的方案需要对全量数据做重新排序,十亿行级数据会占用大量内存,还会生成大量临时磁盘文件做外部排序,耗时是上述方案的数倍到数十倍不等。而-m参数完全利用了两个文件本身已排序的特性,内存占用极低,仅需要存储两个文件当前待比对的行即可,不会加载全量文件内容到内存。
注意事项
如果你的两个原始文件是使用C语言locale排序得到的,执行合并命令前可以先指定locale避免排序规则不一致导致结果出错:
LC_ALL=C sort -mu 已排序文件1 已排序文件2 > 合并后有序去重文件
内容的提问来源于stack exchange,提问作者Anoiar El Fachtali
相关产品推荐
相关产品推荐

