为何GNU sort对特定文件卡顿10小时以上?
我之前在Ubuntu环境下也碰到过类似的诡异情况——能快速处理大文件,却在小文件上卡到离谱,结合你的场景,大概率是这几个原因导致的,给你梳理下排查和解决思路:
1. 文件内容特性拖垮了排序效率
这是最常见的原因。如果你的600MB文件里有大量重复率极高的超长行,或者存在格式异常的内容(比如没有换行的几GB单行、非标准编码的特殊字符),GNU sort的去重逻辑会陷入低效循环:
- 当重复率极高时,sort需要反复比对已排序的内容来去重,内存缓冲区的利用率会急剧下降,哪怕你分配了6GB内存,也可能因为频繁的磁盘临时文件读写拖慢速度;
- 超长行(比如几MB甚至几十MB的单行)会导致sort无法把多行加载进缓冲区,只能逐行处理,相当于把内存缓冲区的优势完全废掉,变成了低效的磁盘IO操作。
你可以先排查文件内容:
# 查看文件中最长行的长度 wc -L combined.txt # 抽样查看前100行的格式是否正常 head -n 100 combined.txt # 统计前10000行的重复情况,看是否有超高重复的行 head -n 10000 combined.txt | sort | uniq -c | sort -nr | head -10
如果确实是超长行的问题,可以先对超长行做预处理(比如拆分、截断),或者用sort的--buffer-size参数强制指定更大的缓冲区(比如sort -u --buffer-size=70% combined.txt),让sort能一次性加载更多内容。
2. GNU sort版本的性能bug
Ubuntu 18 LTS自带的coreutils(包含sort)是8.28版本,这个版本在处理高重复率文件的去重逻辑上存在一些性能缺陷。你能顺利处理3GB未排序文件,可能是因为那个文件的重复率低,排序环节的瓶颈不在去重上,而600MB的文件刚好触发了这个bug。
解决办法就是升级coreutils:
# 添加ppa源获取更新版本 sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt update sudo apt install coreutils # 验证版本,应该会升到8.30以上 sort --version
3. 虚拟机IO的隐性瓶颈
虽然你说磁盘空间充足,但虚拟机的磁盘IO性能往往是软肋——当sort需要频繁读写临时文件时(比如因为内容特性无法高效利用内存缓冲区),虚拟机的虚拟磁盘会比物理磁盘慢很多。而3GB文件能正常处理,可能是因为它的排序过程中临时文件的读写次数更少。
你可以尝试把sort的临时目录切换到内存盘,避免磁盘IO的拖累:
# 将临时目录指向内存中的/dev/shm export TMPDIR=/dev/shm # 再执行排序去重 sort -u combined.txt > combined_sorted.txt
注意:内存盘的空间要足够,600MB的文件可能需要2-3倍的临时空间,确保你的虚拟机有足够空闲内存。
4. 命令组合的潜在问题
虽然你说合并成单个文件后还是卡,但find ... -exec sort -u {} +的参数传递方式可能让sort同时处理多个文件,内部的合并逻辑可能和处理单个文件略有不同。另外原命令的-o逻辑可能存在漏洞(-type f只作用于第一个文件名,后面的条件可能会匹配到非文件类型),你可以试试先合并文件再排序的方式:
find backups -type f \( -iname 'file0.txt' -o -iname 'file1.txt' -o -iname 'file2.txt' -o -iname 'file3.txt' \) | xargs cat | sort -u > combined.txt
内容的提问来源于stack exchange,提问作者j58765436

