繁体   English   中英

mmap()用于大文件I / O?

[英]mmap() for large file I/O?

我正在用C ++创建一个在Linux上运行的实用程序,它可以将视频转换为专有格式。 视频帧非常大(高达1600万像素),我们需要能够直接寻找精确的帧数,因此我们的文件格式使用libz单独压缩每个帧,并将压缩数据附加到文件上。 一旦完成所有帧的写入,包含每个帧的元数据(包括其文件偏移和大小)的日志将被写入文件的末尾。

我目前正在使用ifstream和ofstream来执行文件i / o,但我希望尽可能地进行优化。 我听说mmap()可以在很多情况下提高性能,我想知道我的是否是其中之一。 我们的文件将在几十到几百千兆字节,虽然写入总是按顺序完成,但是随机访问读取应该在恒定时间内完成。 是否有任何想法我是否应该进一步调查,如果有的话,是否有任何提示要注意事项?

谢谢!

在32位计算机上,您的进程限制为2-3 GB的用户地址空间。 这意味着(允许其他内存使用)您将无法一次映射超过1 GB的文件。 并不意味着你不能使用mmap()非常大的文件-只是你需要将文件中的一部分,在一个时间映射。

话虽这么说, mmap()仍然可以成为大文件的一大胜利。 最重要的优点是您不会浪费内存来保存数据TWICE - 系统缓存中的一个副本,应用程序的专用缓冲区中的一个副本 - 以及制作这些副本的CPU时间。 它可以是随机访问的更大的加速 - 但“随机”部分必须限制在您当前的映射范围内。

如果您的文件是10 GB或更多,那么甚至不要考虑尝试在32位架构上使用mmap() 直接转到64位操作系统,应该可以正常处理它。

请注意,映射到内存空间的文件实际上并不消耗相同数量的RAM(文件大小),因此您无需在计算机中安装数百GB的RAM。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM