time awk 'END {print NR}' test.tsv; time wc -l test.tsv
809162924
real 2m22.713s
user 1m46.712s
sys 0m19.618s
809162924 test.tsv
real 0m20.222s
user 0m9.629s
sys 0m10.592s
另一个文件 72G Sample.sam
time awk 'END {print NR}' Sample.sam; time wc -l Sample.sam
180824516
real 1m18.022s
user 1m5.775s
sys 0m12.238s
180824516 Sample.sam
real 0m22.534s
user 0m4.599s
sys 0m17.921s
如果此信息尚未作为元数据存在于单独的文件中(或嵌入在数据中,或通过查询导出数据的系统可用)并且如果没有可用的某种描述的索引文件,则计算行数的最快方法是
wc -l
在文件上使用。你真的不能更快地做到这一点。
要计算文件中的记录数,您必须知道使用了什么记录分隔符并使用类似
awk
的方法来计算这些记录。同样,如果此信息尚未作为元数据存储在其他地方,并且无法通过对原始系统的查询获得,并且记录本身尚未在文件中枚举和排序。您不应使用基于行的实用程序,例如
awk
和sed
。read()
这些实用程序将为输入文件中的每一行发出系统调用(请参阅该答案以了解为什么会这样)。如果你有很多行,这将是一个巨大的性能损失。由于您的文件大小为 4TB,我想有很多行。所以甚至
wc -l
会产生很多read()
系统调用,因为它16384
每次调用只读取字节(在我的系统上)。无论如何,这将是对awk
and的改进sed
。最好的方法——除非你编写自己的程序——可能只是这不是 cat 的无用用途,因为每次系统调用(在我的系统上)
cat
读取字节块并且会发出更多,但不是直接在文件上,而是在管道上。但是,尝试尽可能多地读取每个系统调用。131072
read()
wc -l
cat
循环文件是 AWK 的工作……没有什么能比得上这个速度
7168 行需要 5 毫秒……还不错……
所以这里是 awk 和 wc 之间的速度测试
67G测试.tsv
另一个文件 72G Sample.sam
我还对大型 VCF 文本文件进行了速度比较。这是我发现的:
216GB VCF 文本文件(在单个 SSD 上)
最后:
结论一:
wc -l
SSD似乎最快。216GB VCF 文本文件(在具有 8 个 HDD 的 RAID10 设置上)
最后:
结论 2:
wc -l
似乎与其他人相当。LC_ALL=C && time fgrep -n <last_line_pattern>
很可能是由于缓存,因为随后wc -l
也显示较低的时间。以下是对我
tail -5
有用的文件,然后在最后一行使用 grep 中的-n
选项grep
...