如何有效地将ram_base文件复制到磁盘

时间:2010-04-03 19:15:08

标签: c linux

我想将一个基于ram的大文件(位于/ dev / shm direcotry)复制到本地磁盘,是否有某种方法可以有效地复制而不是逐个读取char或创建另一个内存?我这里只能使用C语言。无论如何我可以将内存文件直接放到磁盘上吗?谢谢!

6 个答案:

答案 0 :(得分:2)

我会mmap()这些文件,并在它们之间进行memcpy()

答案 1 :(得分:1)

谢谢你们的帮助!我通过mmap创建了基于ram的文件,并将整个块直接写入目标。没有使用memcopy,因为我实际上是在写一个并行文件系统(pvfs),它不支持mmap操作。

答案 2 :(得分:0)

/ dev / shm是共享内存,因此复制它的一种方法是将其作为共享内存打开,但坦率地说,我认为你不会获得任何收益。

将内存文件写入磁盘时,瓶颈就是磁盘。 只要确保以大块的形式写数据,你应该没问题。

答案 3 :(得分:0)

您可以像任何其他文件一样复制它:

cp /dev/shm/tmp ~/tmp

因此,快速,简单的方法是通过cp发出system()命令。

答案 4 :(得分:0)

您可以尝试查看splice系统调用是否适用于此。我不确定它是否会,因为它对它可以使用的文件类型有一些限制,但是如果它确实有效,你会反复调用内存页面大小(或一些多页面大小)请求,直到它完成,内核会非常有效地处理它。

如果这不起作用,您需要执行mmap或执行普通的read / write。 在内存页面大小的块中读取和写入使事情更有效。如果缓冲区的内存页大小是对齐的,那么它会更有效率,因为它打开了内核的机会,只是通过内存管理技巧将数据移入/移出进程的内存而不是实际复制数据。

答案 5 :(得分:0)

你唯一能做的就是在页面大小对齐的块中读取()。我假设您需要保证写入的数据,这意味着通过posix_fadvise()或使用O_DIRECT绕过缓冲区(我通常使用posix_fadvise(),但O_DIRECT在这里是合适的。)

在这种情况下,单独写入媒体的速度决定了这种情况发生的速度。

如果您不需要绕过缓冲区,操作将更快完成,但无法保证在重启/断电等情况下实际写入数据。由于数据源位于共享内存,我(再次)猜测你希望保证写入。

唯一可以优化的是read()将数据从共享内存传输到您自己的地址空间需要多长时间,哪些页面大小对齐的块将会改进。