用更少的时间创建大文件


18

我想创建一个大文件〜10G,其中填充了零和随机值。我试过使用:

dd if=/dev/urandom of=10Gfile bs=5G count=10

它创建一个大约2Gb的文件,并以退出状态“ 0”退出。我不明白为什么?

我也尝试使用以下方法创建文件:

head -c 10G </dev/urandom >myfile

创建它大约需要28-30分钟。但我希望它能更快地创建。有人有解决方案吗?

我也想创建多个具有相同(伪)随机模式的文件进行比较。有人知道这样做的方法吗?


欢迎来到AskUbuntu!dd由于块大小,您可能会遇到错误。您可能想看看这篇文章stackoverflow.com/questions/6161823/…它有一些很好的答案,如何计算最佳块大小,以及一些用户脚本/程序和其他使用的建议dd
没时间

Answers:


12

如何使用fallocate,该工具允许我们为文件预分配空间(如果文件系统支持此功能)。例如,将5GB的数据分配给名为“ example”的文件,则可以执行以下操作:

fallocate -l 5G example

这比dd快得多,并且将非常快速地分配空间。


该文件是否包含随机数据,或者包含所分配的磁盘空间上的所有内容?
cprn

它将包含所有零。基本上,空间是预先分配的,如果您不修改数据,它将被假定为零。
科林·伊恩·金

怎么比转储更快/dev/zero呢?
cprn

1
这是非常快的,因为它是一个阻止预分配的系统调用(例如,它保留了空间,但执行的I / O最少),其中,从/ dev / zero到文件的dd涉及读取/写入的负载。
科林·伊恩·金

我正在整理这个。不过,最后一个问题是……我truncate过去使用过,发现它实际上并没有在设备上分配文件,只是创建了一个任意大文件,直到被访问为止,而与可用空间无关。您确定不是fallocate吗?我会检查一下,但我正在使用手机...
cprn

9

您可以dd用来创建仅由零组成的文件。例:

dd if=/dev/zero of=zeros.img count=1 bs=1 seek=$((10 * 1024 * 1024 * 1024 - 1))

这是非常快的,因为实际上只将一个字节写入了物理磁盘。但是,某些文件系统不支持此功能。

如果要创建包含伪随机内容的文件,请运行:

dd if=/dev/urandom of=random.img count=1024 bs=10M

我建议您使用10M作为缓冲区大小(bs)。这是因为10M不太大,但是它仍然可以为您提供良好的缓冲区大小。它应该非常快,但是它始终取决于您的磁盘速度和处理能力。



1

回答问题的第一部分:

尝试一次写入5GB的缓冲区不是一个好主意,因为您的内核可能不支持该缓冲区。在任何情况下,它都不会给您带来任何性能上的好处。一次写入1M是一个很好的最大值。


0

这个问题是5年前提出的。我只是偶然发现了这一点,想补充一下我的发现。

如果您只是使用

dd if=/dev/urandom of=random.img count=1024 bs=10M

如xiaodongjie所述,它的运行速度将显着提高。但是,你可以更快的使用使它eatmydata

eatmydata dd if=/dev/urandom of=random.img count=1024 bs=10M

什么eatmydata所做的就是关闭fsync制作光盘写入速度更快。

您可以在https://flamingspork.com/projects/libeatmydata/上了解有关它的更多信息。


1
我看它的方式一dd开始就足够快,有一个原因叫libEAT-MY-DATA。
卡雷尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.