Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何高效地将ram_基文件复制到磁盘_C_Linux - Fatal编程技术网

C 如何高效地将ram_基文件复制到磁盘

C 如何高效地将ram_基文件复制到磁盘,c,linux,C,Linux,我想将一个基于ram的大文件(位于/dev/shm direcotry)复制到本地磁盘上,有什么方法可以实现高效复制,而不是逐个读取字符或创建另一块内存?我在这里只能用C语言。我是否可以将内存文件直接放入磁盘?谢谢 /dev/shm是共享内存,所以复制它的一种方法是将其作为共享内存打开,但坦率地说,我认为您不会获得任何好处 将内存文件写入磁盘时,瓶颈将是磁盘。 只需确保以大块方式写入数据,就可以了。您可以像复制任何其他文件一样复制数据: cp /dev/shm/tmp ~/tmp 因此,一种快

我想将一个基于ram的大文件(位于/dev/shm direcotry)复制到本地磁盘上,有什么方法可以实现高效复制,而不是逐个读取字符或创建另一块内存?我在这里只能用C语言。我是否可以将内存文件直接放入磁盘?谢谢

/dev/shm是共享内存,所以复制它的一种方法是将其作为共享内存打开,但坦率地说,我认为您不会获得任何好处

将内存文件写入磁盘时,瓶颈将是磁盘。
只需确保以大块方式写入数据,就可以了。

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

cp /dev/shm/tmp ~/tmp

因此,一种快速、简单的方法是通过
system()
发出
cp
命令,我将
mmap()
文件并在它们之间执行
memcpy()

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

如果这不起作用,您将需要执行mmap或执行普通的旧
读取
/
写入

在内存中读写页面大小的块使事情更加高效。如果您的缓冲区与内存页大小一致,则效率会更高,因为这为内核提供了一个机会,可以通过内存管理技巧将数据移动到进程内存中或从进程内存中移出,而不是实际复制数据。

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

在这种情况下,仅写入介质的速度就决定了写入的速度

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


您唯一可以优化的是read()将数据从共享内存获取到您自己的地址空间所需的时间,页面大小对齐的块将得到改进。

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

如果使用比一个字节更大的块,您将获得更高的性能。最佳解决方案是让硬件使用DMA来完成,但不幸的是,我不知道这是否可以在Linue上完成。-1因为这是一个低性能的解决方案,并且它通过system()使用外部程序(这本身会导致各种问题)(它使用shell运行命令,导致各种其他问题)。在C中实现相同的复制操作只需要几行代码;文件*output=fopen(“bar”、“wb”);对于(int-ch;(ch=fgetc(输入))!=EOF;fputc(ch,输出)){}fclose(输出);fclose(输入);//这是一个简单的实现,远不是完美的,但它只是一个开始。我怀疑它是否能提供良好的性能。它仍然在CPU上进行复制,而在基准测试中,MMAP对于线性访问的速度往往比其他方法慢。这不会迫使CPU接触内存。如果数据已经设置好,只需要写入,我认为这是完成任务的一种非常直接的方法。
memcpy()
肯定会涉及CPU触摸内存。它不知道目标是一个内存映射文件。