linux下快速创建大文件
以前创建文件我一般用dd来创建,例如创建一个512M的文件:
# dd if=/dev/zero of=file bs=512k count=1024
小文件创建速度还可以接受,文件一大就不行了。
原理上很简单,这个dd起了搬运工的作用,open输入文件后不停的read后write到输出文件,会产生大量的内核空间到用户空间,和用户空间到内核空间的复制操作以,以及对输出文件的频繁写入,实际上我们需要的只是一个空间(比如用来做文件系统用),不需要管它的初始内容是不是零,这个做法太重量级了。
记得以前做Windows开发的时候,有个API叫SetEndOfFile,可以用来将文件内部游标所在位置设为文件末尾,可以用来截取或者扩展文件,这个函数本质上相当于直接操作文件分区表的结构,用它来作文件扩展是不需要频繁的填充文件,linux下肯定也有对应的东西,即ftrunc/truncate这两个函数。
那么直接利用这个特性来创建大文件的工具就肯定有人做好了,经搜索找到了fallocate和truncate两个命令, 以及GNU dd的seek扩展:
# fallocate -l 10G bigfile
# truncate -s 10G bigfile
# dd of=bigfile bs=1 seek=10G count=0
文件系统对于这样创建的文件有特殊处理,叫稀疏文件,关于这个的详细资料可以参考 这里。
现在创建大文件光速了,再也不用纠结等半天了。
Last modified on 2013-09-13