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