在工作中,我们有一个应用程序可以播放 2K (2048*1556px) OpenEXR 电影序列。效果很好..除了超过 3GB 的序列(很常见)之外,它必须从内存中卸载旧帧,尽管事实上所有机器都有 8-16GB 内存(可以通过 linux BIGMEM 来寻址)。

这些帧必须缓存到内存中才能实时播放。该操作系统是已有几年历史的 32 位 Fedora Distro(在可预见的将来不可能升级到 64 位)。每个进程的限制是每个进程 3GB。

基本上,是否可以以某种方式在内存中缓存超过 3GB 的数据?我最初的想法是在多个进程之间传播数据,但我不知道这是否可行。

有帮助吗?

解决方案

创建一个 RAM 驱动器并将文件加载到该驱动器中怎么样?假设 RAM 驱动器支持 BIGMEM 内容。

您可以使用多个进程:每个进程将文件的视图加载为共享内存段,然后播放器进程根据需要依次映射这些段。

其他提示

一种可能是使用 mmap。您可以将数据的不同部分映射/取消映射到同一虚拟内存区域。一次只能映射一组,但只要有足够的物理内存,数据就应该保持驻留。

天啊,多么有趣的问题啊:)

(编辑: :哦,我刚刚读了 Rob 的内存驱动器帖子...我对这个问题感到非常兴奋...但还有更多建议,所以我不会删除)

是否有可能...

  1. 设置一个多 GB 的 RAM 磁盘,然后
  2. 修改程序以完成从“磁盘”读取的所有操作?

我猜想内存磁盘部分是所有问题所在,因为内存磁盘的大小取决于操作系统和文件系统。您可能必须创建多个 RAM 磁盘并让代码在它们之间跳转。或者您可以在多个 RAM 磁盘上设置 RAID-0 条带集。或者,如果仍然存在操作系统限制,并且您有能力放弃几大(4k?),请使用一些新的超快固态驱动器设置硬件 RAID-0 条带集。或者...

有趣,有趣,有趣。

一定要跟进!

我假设您可以修改该应用程序。如果是这样,最简单的方法是多次启动应用程序(每个 3GB 视频块启动一次),让每个应用程序保存一块视频,并使用另一个程序来同步它们,以便它们各自控制帧缓冲区(或其他视频输出)依次。

同步可能会有点混乱,但如果每个应用程序都有自己的帧缓冲区,并且同步程序在切换到下一个应用程序时将视频控制器指向帧之间的正确帧缓冲区,则可以简化同步。

@dbr 说:

有一台评测机配备了荒谬的光纤通道 RAID 阵列,可以轻松地直接从阵列播放 2K 文件。问题出在艺术家工作站上,所以它不会是一个 4000 美元的 RAID 阵列,而是数百个......

好吧,如果您可以接受约 30GB 的限制,那么单个 36GB SSD 驱动器可能就足够了?我认为这些价格约为 1000 美元,而且数据速率可能就足够了。这可能比纯 RAM 方法更便宜。还有更小的尺寸可供选择。如果~60GB 就足够了,您可能会以双倍的成本使用 2 个 JBOD 阵列,并跳过 RAID 控制器。请务必只关注高端 SSD 选项——低端产品充斥着精美的记忆棒。:P

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top