在32位操作系统上,将超过3GB的视频帧存储在内存中
在工作中,我们有一个应用程序可以播放2K(2048 * 1556px)OpenEXR电影序列。它工作得很好..除了当序列超过3GB(非常常见)时,它还必须从内存中卸载旧帧,尽管事实上所有机器都有8-16GB的内存(可通过linux BIGMEM东西寻址)。
必须将这些帧缓存到内存中才能实时播放。该操作系统是使用了几年的32位Fedora Distro(在可预见的将来,不可能升级到64位)。每个进程的限制是每个进程3GB。
基本上,是否可以以某种方式在内存中缓存超过3GB的数据?我最初的想法是在多个进程之间分配数据,但是我不知道这是否可行。
解决方案
回答
假设RAM驱动器为我们支持BIGMEM,则如何创建RAM驱动器并将文件加载到该驱动器中。
我们可以使用多个进程:每个进程将文件视图加载为共享内存段,然后播放器进程按需依次映射这些段。
回答
一种可能是使用mmap。我们会将数据的不同部分映射/取消映射到同一虚拟内存区域。我们一次只能映射一个集合,但是只要有足够的物理内存,数据就应该保持驻留状态。
回答
我假设我们可以修改应用程序。如果是这样,最简单的方法是几次启动应用程序(每个3GB的视频块一次),让每个人都保存一个视频块,然后使用另一个程序进行同步,以便它们各自控制帧缓冲区(或者其他视频输出)。
同步可能会有些混乱,但是如果每个应用程序都有自己的帧缓冲区,并且在切换到下一个应用程序时,同步程序将视频控制器指向帧之间的正确帧缓冲区,则可以简化同步。
回答
我的,一个有趣的问题:)
(编辑:哦,我刚刚读了Rob的ram驱动器文章...我对这个问题感到非常兴奋...但是还有更多建议,所以我不会删除)
可以...
- 设置一个千兆字节的ram磁盘,然后
- 修改程序以完成从"磁盘"读取的所有内容?
我猜想ram磁盘部分就是所有问题所在,因为ram磁盘的大小取决于操作系统和文件系统。我们可能需要创建多个ram磁盘,并使代码在它们之间跳转。或者,我们可以在多个ram磁盘上设置RAID-0条带集。或者,如果仍然存在操作系统限制,并且我们有能力舍弃几个(4k?),则可以使用其中一些新型的快速固态硬盘来设置硬件RAID-0条带集。或者...
好玩,好玩,好玩。
请务必跟进!
回答
@dbr说:
There is a review machine with an absurd fiber-channel-RAID-array that can play 2K files direct from the array easily. The issue is with the artist-workstations, so it wouldn't be one 00 RAID array, it'd be hundreds..
好吧,如果我们可以接受〜30GB的限制,那么单个36GB SSD驱动器也许就足够了?我认为它们的价格约为每千美元,数据速率可能就足够了。这可能比纯RAM方法便宜。也有较小的尺寸。如果〜60GB足够,我们可能可以避免使用2的JBOD阵列以使成本增加一倍,并跳过RAID控制器。确保只看高端SSD选项-低端充满光荣的记忆棒。 :P