在工作中,我们有一个应用程序可以播放2K(2048 * 1556px)的OpenEXR电影序列。它运行良好..除了超过3GB(非常常见)的序列,它必须从内存中卸载旧帧,尽管事实上所有机器都有8-16GB的内存(可通过linux BIGMEM东西寻址)。
必须将帧缓存到内存中才能实时播放。操作系统是一个具有几年历史的32位Fedora Distro(在可预见的未来,无法升级到64位)。每个进程的限制为每个进程3GB。
基本上,有可能以某种方式在内存中缓存超过3GB的数据吗?我最初的想法是在多个进程之间传播数据,但我不知道这是否可行..
答案 0 :(得分:3)
一种可能是使用mmap。您可以将数据的不同部分映射/取消映射到同一虚拟内存区域。您一次只能映射一个集,但只要有足够的物理内存,数据就应该保持驻留。
答案 1 :(得分:2)
如何创建RAM驱动器并将文件加载到该驱动器中...假设RAM驱动器支持BIGMEM的东西。
您可以使用多个进程:每个进程将文件视图作为共享内存段加载,然后播放器进程根据需要依次映射这些段。
答案 2 :(得分:1)
我假设你可以修改应用程序。如果是这样,最简单的方法是多次启动应用程序(每个3GB视频块一次),让每个应用程序保存一大块视频,并使用另一个程序同步它们,以便它们各自控制帧缓冲区(或其他视频输出)依次。
同步可能会有点混乱,但如果每个应用程序都有自己的帧缓冲区,并且同步程序在切换到下一个应用程序时将视频控制器指向帧之间的正确帧缓冲区,则可以简化同步。
答案 3 :(得分:1)
我的,这是一个有趣的问题:)
(编辑:哦,我刚看了Rob的ram驱动器帖子......我对这个问题感到很兴奋......但是还有一些建议,所以我不会删除)
是否有可能......
我猜ram磁盘部分是所有问题所在,因为ram磁盘的大小将取决于操作系统和文件系统。您可能必须创建多个ram磁盘并让代码在它们之间跳转。或者您可以在多个ram磁盘上设置RAID-0条带集。或者,如果仍然存在操作系统限制并且您可以放弃一些盛大的(4k?),请使用一些新的快速固态驱动器设置硬件RAID-0条带集。还是......
有趣,有趣,有趣。
请务必跟进!
答案 4 :(得分:0)
@dbr说:
有一个带有荒谬光纤通道RAID阵列的评测机,可以轻松直接从阵列播放2K文件。问题在于艺术家工作站,所以它不会是一个4000美元的RAID阵列,而是数百个......
那么,如果你能接受~30GB的限制,那么一块36GB的SSD硬盘就足够了吗?那些我认为每个约1美元,数据速率可能就足够了。这很可能比纯RAM方法便宜。还有更小的尺寸。如果~60GB就够了,你可能会因为两倍的成本而使用2的JBOD阵列,并跳过RAID控制器。确保只关注更高端的SSD选项 - 低端充满了美化的记忆棒。 :P