C 在/dev/shm中并行创建大文件:性能

C 在/dev/shm中并行创建大文件:性能,c,filesystems,ramdisk,C,Filesystems,Ramdisk,我需要在/dev/shm中创建一个大文件(几GB)。这是Linux机器上的RAMdisk。这必须尽可能快。我目前在C中使用5个单独的POSIX线程来创建连续的100Mbyte段,然后我有另一个线程将它们连接到主输出文件中 这很快,但我想走得更快。我可以消除连接线程吗?有没有办法打开一个文件,并让每个线程将它的100兆字节段写入最终输出文件的正确位置?最快的方法是调用truncate()或ftruncate()将文件扩展到您想要的大小 然后,您可以将文件mmap()放入进程的内存空间,并让每个线程

我需要在/dev/shm中创建一个大文件(几GB)。这是Linux机器上的RAMdisk。这必须尽可能快。我目前在C中使用5个单独的POSIX线程来创建连续的100Mbyte段,然后我有另一个线程将它们连接到主输出文件中


这很快,但我想走得更快。我可以消除连接线程吗?有没有办法打开一个文件,并让每个线程将它的100兆字节段写入最终输出文件的正确位置?

最快的方法是调用
truncate()
ftruncate()
将文件扩展到您想要的大小


然后,您可以将文件
mmap()
放入进程的内存空间,并让每个线程将其节写入映射区域。

只需为每个线程打开一次文件,
lseek
到线程的起始位置,然后正常写入
。或者,您可以使用
pwrite
指定写入的位置;在这种情况下,所有线程都可以共享一个打开的文件,因为它们不需要使用当前文件位置


如果您想提前确保为整个最终文件保留可用空间,
posix_fallocate
应该能够为您解决这个问题。

我尝试过这个,它可能会起作用。但我能够“创建”比包含它们的文件系统更大的文件。不知何故,这似乎是不对的。所以基本思想是:首先,使用truncate创建一个巨大的文件,然后每个线程使用lseek()向前移动到文件中的位置,然后该线程在那里写入数据?是吗?好的。mmap()。没有想到这一点。
truncate
是不需要的
lseek
单独就可以完成这项工作。嗯,
mmap
方法需要
truncate
,但
write
不需要。