MLS*_*LSC 8 memory sed awk sort uniq
我有大文本文件(1.5 G),
我想知道 Linux 中最快、最可靠的工具是什么。
我通常使用:
awk '!x[$0]++' file.txt
Run Code Online (Sandbox Code Playgroud)
但是当我使用htop
命令时,我看到我的内存使用量在增加。
我想知道对于大文件来说什么是最快和更可靠的。
uniq?
sort?
sed?
awk?
Run Code Online (Sandbox Code Playgroud)
为什么?
Bar*_*mar 17
让我们考虑每个解决方案的工作原理。
uniq
这要求文件已经排序。如果没有,您必须先通过管道将其通过sort
,这意味着sort
必须将整个文件读入内存,对其重新排序 ( O(n log n)
),然后将其写入管道。的工作uniq
非常便宜,因为它只需要比较其输入的相邻行。
sort -u
这结合了sort | uniq
. 这必须像awk
脚本一样将所有唯一的输入收集到内存中,但它也会浪费时间在生成输出之前对它们进行排序。这是O(n log n)
,尽管在这种情况下n
是唯一项目的数量,而不是所有输入。所以它比管道好。
sed
我不确定你为什么列出这个,因为我根本想不出一个好的方法来做到这一点sed
。也许如果您首先对其进行排序并通过管道传输到sed
脚本,则有一种方法可以比较相邻的行。所以sed
只会做应该做的事情uniq
,并且uniq
可能会尽可能高效地做。
awk
这可能是最好的,因为它只做最少量的工作。当它读取每一行时,它会进行有效的散列查找以查看该行是否已经在其内存中,并且仅将唯一行存储为散列键,并将计数器存储为值。(如果该行以前不存在,则条件为真,因此将打印该行。否则不会。)这会占用O(n)
时间和O(uniq n)
内存。
每种方法都将使用大量内存,用于对输入进行排序或跟踪哪些输入已经看到,以便它们可以删除重复项。