32 ビット OS 上で 3 GB を超えるビデオ フレームをメモリに保存
質問
職場では、2K (2048*1556px) OpenEXR フィルム シーケンスを再生するアプリケーションがあります。うまくいきます。シーケンスが 3 GB を超える場合 (非常に一般的)、すべてのマシンに 8 ~ 16 GB のメモリ (Linux BIGMEM 経由でアドレス指定可能) があるにもかかわらず、古いフレームをメモリからアンロードする必要があります。
リアルタイムで再生するには、フレームをメモリにキャッシュする必要があります。OS は数年前の 32 ビット Fedora Distro です (当面は 64 ビットにアップグレードできません)。プロセスごとの制限はプロセスごとに 3 GB です。
基本的に、何らかの方法で 3 GB を超えるデータをメモリにキャッシュすることは可能ですか?私の最初のアイデアは、複数のプロセス間でデータを分散することでしたが、それが可能かどうかはわかりません。
解決
RAMドライブを作成してそこにファイルをロードしてみてはどうでしょうか...RAM ドライブが BIGMEM 機能をサポートしていると仮定します。
複数のプロセスを使用することもできます。各プロセスはファイルのビューを共有メモリ セグメントとしてロードし、プレーヤー プロセスは必要に応じてセグメントを順番にマップします。
他のヒント
1 つの可能性は mmap を使用することです。データのさまざまな部分を同じ仮想メモリ領域にマップ/マップ解除します。一度にマップできるセットは 1 つだけですが、十分な物理メモリがある限り、データは常駐するはずです。
なんと興味深い問題でしょう :)
(編集:ああ、Rob の RAM ドライブの投稿を読みました...この問題に興奮しました...しかし、もう少し提案したいことがあるので、削除しません)
可能でしょうか...
- マルチギガバイトの RAM ディスクをセットアップしてから、
- 「ディスク」からの読み取りをすべて実行するようにプログラムを変更しますか?
RAM ディスクのサイズは OS とファイル システムに依存するため、すべての問題は RAM ディスク部分にあると思います。複数の RAM ディスクを作成し、それらの間でコードをジャンプさせる必要がある場合があります。あるいは、複数の RAM ディスク上に RAID-0 ストライプ セットをセットアップすることもできます。または、まだ OS の制限があり、数ランド (4k?) をドロップできる余裕がある場合は、新しい超高速ソリッド ステート ドライブをいくつか備えたハードウェア RAID-0 ストリップ セットをセットアップします。または...
楽しい楽しい楽しい。
必ずフォローしてください!
アプリケーションを変更できると思います。その場合、最も簡単な方法は、アプリケーションを数回 (ビデオの 3GB チャンクごとに 1 回) 起動し、それぞれにビデオのチャンクを保持させ、別のプログラムを使用してアプリケーションを同期させ、それぞれがフレームバッファ (または他のビデオ出力)を順に選択します。
おそらく同期は少し面倒になるでしょうが、各アプリが独自のフレームバッファを持ち、次のアプリに切り替えるときに同期プログラムがビデオ コントローラーにフレーム間の正しいフレームバッファを指すようにすれば、簡素化できます。
@dbr さんはこう言いました。
アレイから直接 2K ファイルを簡単に再生できる、ばかげたファイバー チャネル RAID アレイを搭載したレビュー マシンがあります。問題はアーティスト ワークステーションにあるため、4000 ドルの RAID アレイ 1 台ではなく、数百台になるでしょう。
そうですね、最大 30 GB の制限を許容できるのであれば、おそらく 1 つの 36 GB SSD ドライブで十分でしょうか?これらはそれぞれ約 1,000 米ドルだと思いますが、データ速度は十分かもしれません。これは、おそらく純粋な RAM アプローチよりも安価である可能性があります。小さいサイズもご用意しております。~60GB で十分な場合は、おそらく 2 倍のコストで 2 つの JBOD アレイを使用し、RAID コントローラをスキップすることができます。必ずハイエンドの SSD オプションのみに注目してください。ローエンドには栄光のメモリ スティックが詰め込まれています。:P