我需要通过提供逐渐变大的输入文件来对程序进行压力测试。我有一个输入文件inputSmall.txt
,我想将N
次复制cat
并将N
个副本复制到同一个文件中。 N=1000
是大文件。如果有任何比下面的简单循环更快的工作(例如for i in {1..1000}
do
cat inputSmall.txt >> input1000.txt
done
):
inputN.txt
我的机器有足够的磁盘空间来存储N
非常大的{{1}}并且有很多RAM,以防它相关。
THX
答案 0 :(得分:0)
写作时
for i in {1..1000}
您告诉shell首先将1到1000之间的所有数字写入命令缓冲区,然后遍历每个数字。对于大数字而言,这不仅很慢,而且还增加了大量内存需求(例如,请参见unix.se上的this post)。
在bash中,您可以使用以下语法来避免所有这些:
for ((i=1; i<=1000;i++))
作为奖励,这允许边界是变量。
答案 1 :(得分:0)
通过这种方式,您可以更快地执行此操作并且#34;指数&#34;,但您需要为tmp文件提供一些额外的磁盘空间。
input=$1
new=${input}.new.txt
tmp=${input}.tmp.txt
cat ${input} > ${new}
cat "" > ${tmp}
# 2^10=1024
for ((i=0; i<10 ; i++))
do
cat ${new} >> ${tmp}
cat ${tmp} >> ${new}
done
rm ${tmp}
答案 2 :(得分:0)
cat
是一个外部命令,而不是shell的一部分;像所有外部命令一样,启动它会产生很大的开销。类似地,运行>>input1000.txt
是一个相当昂贵的文件系统操作 - 查找与目录关联的inode,打开它,然后(在离开范围时)刷新内容并关闭文件。
只做一次这样的事情会更有效率。
假设inputSmall.txt
的最后一行以换行符结尾,以下内容将正常运行,并且开销更少:
in=$(<inputSmall.txt) # read the input file only once
exec 3>>input1000.txt # open the output file only once
for ((i=0; i<1000; i++)); do
printf '%s\n' "$in" >&3 # write the input from memory to the output fd
done
exec 3>&- # close the output fd