BUAAZP.

生成大文件的方法

June 13, 2014

生成大文件的方法

@招牌疯子

今天群里讨论到生成大文件的问题,由于这种小技术经常会用到,所以记一下。 第一种是组内同学用到的fsutil file createnew命令,实际是操作的磁盘,划出一段空间标记成文件,看起来是生成了,其实只操作了文件头和文件尾,所以内容肯定是空。优点是速度很快;缺点是文件内容固定都是\0,而且只适用于FAT和NTFS等windows分区,附上一个例子:

fsutil file createnew bigfile.tmp 1000000  

第二种也是比较推荐的,用linux/unix下的dd命令,dd命令的具体用法可以自行百度去,我们用到的参数有【if】标准输入源,可以是文件也可以是某个挂载的分区,【of】标准输出目标,【bs】块大小,【count】块数量,【seek】跳过多少块之后才开始写内容。从参数就可以看出来dd命令是真正地在写文件到硬盘上,所以生成文件的速度取决于硬盘读写速度,文件越大速度越慢,我在自己mac pro上生成1G的文件用时20s多一点。dd命令的优点是生成文件的内容可控制,对硬盘分区格式无要求;缺点是生成速度慢。下面通过三个例子来说明一下,注意bs所用的单位,小写适用于mac系统,大写适用于linux系统。

dd if=/dev/zero of=bigfile.tmp bs=1m count=1000  

生成一个大小为1G的空文件,文件内容全部是\0。但是值得注意的是该方法与上述fsutil命令有本质的区别,所以即使生成了同样的空文件依然需要耗时较长。

dd if=/home/zippo/index.html of=bigfile.tmp bs=1k count=1000  

每次从index.html文件里读取1k的数据写入目标文件,所以生成文件是index.html部分内容的循环。

dd if=/dev/urandom of=bigfile.tmp bs=1m count=1000  

生成一个大小为1G,内容随机的文件,与第一个例子不同的地方在于输入源,/dev/urandom产生随机内容的原理是利用当前系统的熵池来计算出固定数量的随机比特并输出,与之相似的还有一个/dev/random,关于熵池的内容不是本文讨论的范围不再详谈。这条命令在希望产生大量内容不相同的文件时很实用。

最后有一个非常特殊的例子,比如我需要一个1000G的测试数据,但是我总共的磁盘只有100G怎么办呢?

dd if=/dev/zero of=bigfile.tmp bs=1m count=0 seek=1000000  

此时文件系统中显示文件大小为1000G,但实际上不占用任何空间,生成速度也是瞬间完成,seek的作用是跳过指定的大小,实际不写入文件,这个小技巧真的很实用,但是需要注意的此命令在mac下不行,实际测试发现mac下仍然会占用空间。 如有疏漏和错误,请留言告知。

招牌疯子

Coder, OpenSource, DataStorageEngineer. Work@ByteDance
开源爱好者,zimg作者,大规模数据存储工程师。