我正在用C ++创建一个在Linux上运行的实用程序,它可以将视频转换为专有格式。视频帧非常大(高达1600万像素),我们需要能够直接寻找精确的帧数,因此我们的文件格式使用libz单独压缩每个帧,并将压缩数据附加到文件上。一旦完成所有帧的写入,包含每个帧的元数据(包括其文件偏移和大小)的日志将被写入文件的末尾。
我目前正在使用ifstream和ofstream来执行文件i / o,但我希望尽可能地进行优化。我听说mmap()可以在很多情况下提高性能,我想知道我的是否是其中之一。我们的文件将在几十到几百千兆字节,虽然写入总是按顺序完成,但是随机访问读取应该在恒定时间内完成。是否有任何想法我是否应该进一步调查,如果有的话,是否有任何提示要注意的事情?
谢谢!
答案 0 :(得分:8)
在32位计算机上,您的进程限制为2-3 GB的用户地址空间。这意味着(允许其他内存使用)您将无法一次映射超过1 GB的文件。这样做 NOT 意味着您无法将mmap()
用于非常大的文件 - 只需要一次只映射部分文件。
话虽如此,mmap()
仍然可以成为大文件的大赢家。最重要的优点是您不会浪费内存来保存数据 TWICE - 系统缓存中的一个副本,应用程序的专用缓冲区中的一个副本 - 以及制作这些副本的CPU时间。它可以是随机访问的更大的加速 - 但“随机”部分必须限制在当前映射范围内。
答案 1 :(得分:6)
如果您的文件是10 GB或更多,那么甚至不要考虑尝试在32位架构上使用mmap()
。直接转到64位操作系统,应该可以正常处理它。
请注意,映射到内存空间的文件实际上并不占用相同数量的RAM(文件大小),因此您无需在计算机中安装数百GB的RAM。