我们的一个脚本正在将 2 个文件的内容写入另一个文件,以下命令需要 4 分钟。文件1有头记录,文件2有4GB的数据。在文件 3 上,标头记录应位于顶部,然后是文件 2 的内容。
有没有更好的方法可以在 4 分钟内实现这一目标。
cat file1 file2 > file3
谢谢拉古
答案1
只需进行几个本地测试,该sed h file >> destination
命令就会快大约 66%,然后cat
您必须稍微重写脚本才能添加第二个命令,因为sed
只接受单个文件参数,但无论哪种方式,它仍然会更快。
编辑:测试使用了 4GB 的随机文本文件和 unicode 字符时间,通过time
命令测量。
答案2
我的旧笔记本电脑的硬盘速度大约是你的两倍。
我怀疑您可能正在从 BusyBox 运行猫,而不是优化的独立猫。
我检查了四个命令的计时,它们的结果都大致相同(10% 以内)。我使用了 GNU cat、sed、awk 和 dd。我在每次测试之前清除了缓存(在另一个窗口中作为 sudo)
echo 3 > /proc/sys/vm/drop_caches
:
sed 确实(顺便说一句)处理多个输入文件。
$ time cat Timer1 Timer2 > Timer3
real 1m57.536s
user 0m0.072s
sys 0m20.456s
$
$ time sed -e '1n' Timer1 Timer2 > Timer3
real 1m54.450s
user 0m15.924s
sys 0m23.420s
$
$ time awk 1 Timer1 Timer2 > Timer3
real 2m0.080s
user 0m21.752s
sys 0m21.444s
$
$ time { cat Timer1 > Timer3
> dd status=none conv=notrunc oflag=append bs=100M if=Timer2 of=Timer3
> }
$
real 2m9.426s
user 0m0.012s
sys 0m18.260s
$
$ ls -lh Timer?
-rw-r--r-- 1 paul paul 17 Mar 7 11:01 Timer1
-rw-r--r-- 1 paul paul 3.7G Mar 7 11:03 Timer2
-rw-r--r-- 1 paul paul 3.7G Mar 7 11:50 Timer3
$
$ ls -l Timer?
-rw-r--r-- 1 paul paul 17 Mar 7 11:01 Timer1
-rw-r--r-- 1 paul paul 3942530050 Mar 7 11:03 Timer2
-rw-r--r-- 1 paul paul 3942530067 Mar 7 12:06 Timer3
这表明时序主要由 I/O 性能决定,而使用的命令则不太重要。 (使用 shell 读取循环仍然不是一个好主意。)
但值得注意的是,cat 和 dd 使用的用户时间比编辑工具少得多。