如何在Linux (Red Hat Linux)系统中快速创建大文件?
dd可以完成这项工作,但是从/dev/zero读取并写入驱动器可能会花费很长时间,因为您需要一个几百gb大小的文件进行测试……如果你需要重复这样做,时间就会增加。
我不关心文件的内容,我只想快速创建它。如何做到这一点呢?
使用稀疏文件不能解决这个问题。我需要为文件分配磁盘空间。
如何在Linux (Red Hat Linux)系统中快速创建大文件?
dd可以完成这项工作,但是从/dev/zero读取并写入驱动器可能会花费很长时间,因为您需要一个几百gb大小的文件进行测试……如果你需要重复这样做,时间就会增加。
我不关心文件的内容,我只想快速创建它。如何做到这一点呢?
使用稀疏文件不能解决这个问题。我需要为文件分配磁盘空间。
当前回答
一种方法是:如果可以保证不相关的应用程序不会以冲突的方式使用这些文件,那么只需在特定目录中创建一个大小不同的文件池,然后在需要时创建指向它们的链接。
例如,有一个文件池叫做:
/ home / bigfiles 512M-A / home / bigfiles 512M-B / home / bigfiles 1024M-A / home / bigfiles 1024M-B
然后,如果你有一个应用程序需要一个1G的文件,名为/home/oracle/logfile,执行“ln /home/bigfiles/1024M-A /home/oracle/logfile”。
如果它在单独的文件系统上,则必须使用符号链接。
可以使用A/B/etc文件来确保不相关的应用程序之间没有冲突的使用。
链接操作已经尽可能快了。
其他回答
我不认为你会比dd快很多,瓶颈是磁盘;无论你怎么做,写入几百GB的数据都将花费很长时间。
But here's a possibility that might work for your application. If you don't care about the contents of the file, how about creating a "virtual" file whose contents are the dynamic output of a program? Instead of open()ing the file, use popen() to open a pipe to an external program. The external program generates data whenever it's needed. Once the pipe is open, it acts just like a regular file in that the program that opened the pipe can fseek(), rewind(), etc. You'll need to use pclose() instead of close() when you're done with the pipe.
如果你的应用程序需要文件有一定的大小,它将由外部程序来跟踪它在“文件”中的位置,并在到达“结束”时发送一个eof。
一种方法是:如果可以保证不相关的应用程序不会以冲突的方式使用这些文件,那么只需在特定目录中创建一个大小不同的文件池,然后在需要时创建指向它们的链接。
例如,有一个文件池叫做:
/ home / bigfiles 512M-A / home / bigfiles 512M-B / home / bigfiles 1024M-A / home / bigfiles 1024M-B
然后,如果你有一个应用程序需要一个1G的文件,名为/home/oracle/logfile,执行“ln /home/bigfiles/1024M-A /home/oracle/logfile”。
如果它在单独的文件系统上,则必须使用符号链接。
可以使用A/B/etc文件来确保不相关的应用程序之间没有冲突的使用。
链接操作已经尽可能快了。
这是我在以下约束条件下所能做到的最快速度(并不快):
大文件的目标是填满磁盘,因此不能压缩。 使用ext3文件系统。(fallocate不可用)
这是它的要点……
// include stdlib.h, stdio.h, and stdint.h
int32_t buf[256]; // Block size.
for (int i = 0; i < 256; ++i)
{
buf[i] = rand(); // random to be non-compressible.
}
FILE* file = fopen("/file/on/your/system", "wb");
int blocksToWrite = 1024 * 1024; // 1 GB
for (int i = 0; i < blocksToWrite; ++i)
{
fwrite(buf, sizeof(int32_t), 256, file);
}
在我们的情况下,这是一个嵌入式linux系统,这工作得很好,但更喜欢更快的东西。
供您参考,命令dd if=/dev/urandom of=outputfile bs=1024 count = XX速度太慢,无法使用。
这是一个常见的问题——尤其是在当今的虚拟环境中。不幸的是,答案并不像人们想象的那么简单。
Dd显然是第一选择,但Dd本质上是一个副本,它迫使您写入每个数据块(因此,初始化文件内容)…初始化占用了大量的I/O时间。(想要花更长的时间?使用/dev/random而不是/dev/zero!然后你将使用CPU以及I/O时间!)最后,dd是一个糟糕的选择(尽管它本质上是VM“create”gui使用的默认值)。例句:
dd if=/dev/zero of=./gentoo_root.img bs=4k iflag=fullblock,count_bytes count=10G
truncate is another choice -- and is likely the fastest... But that is because it creates a "sparse file". Essentially, a sparse file is a section of disk that has a lot of the same data, and the underlying filesystem "cheats" by not really storing all of the data, but just "pretending" that it's all there. Thus, when you use truncate to create a 20 GB drive for your VM, the filesystem doesn't actually allocate 20 GB, but it cheats and says that there are 20 GB of zeros there, even though as little as one track on the disk may actually (really) be in use. E.g.:
truncate -s 10G gentoo_root.img
fallocate是用于虚拟机磁盘分配的最终——也是最好的——选择,因为它本质上是“保留”(或“分配”您正在寻找的所有空间,但它不需要写任何东西。因此,当您使用fallocate创建一个20 GB的虚拟驱动器空间时,您实际上得到了一个20 GB的文件(不是一个“稀疏文件”,并且您不会费心向其写入任何内容—这意味着几乎任何东西都可以在其中—有点像一个全新的磁盘!)例如:
fallocate -l 10G gentoo_root.img
你可以使用https://github.com/flew-software/trash-dump 您可以创建任意大小和随机数据的文件
这里有一个命令,你可以在安装垃圾转储(创建一个1GB的文件)后运行
$ trash-dump --filename="huge" --seed=1232 --noBytes=1000000000
顺便说一下,这是我创造的