我想将一个基于ram的大文件(位于/ dev / shm direcotry)复制到本地磁盘,是否有某种方法可以有效地复制而不是逐个读取char或创建另一个内存?我这里只能使用C语言。无论如何我可以将内存文件直接放到磁盘上吗?谢谢!
答案 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()将数据从共享内存传输到您自己的地址空间需要多长时间,哪些页面大小对齐的块将会改进。