4

巨大なパックされたデータ配列を作成し、それをディスクに保存したいと考えています。writePackedMessageToFd() を使用しています。ただし、入力データが非常に大きい (50 GB) ため、メモリを解放するためにメッセージの一部をディスクに保存する必要があります。

これは Cap'n Proto の現在のバージョンで可能ですか?

補足: この質問は、出力をストリーミングする必要がないという点で、前述の重複した質問とは異なります。たとえば、理論的には、最初のパスで (未完成の) メッセージ全体を保持する成長するファイルのような他のオプションがある可能性があります。そして、2 回目のパスでメッセージを終了できます。

4

1 に答える 1

2

あなたが説明したことは、おそらくうまくいかないでしょう。パックされたメッセージをディスクから読み取るときは、事前にメッセージ全体を読み取って解凍する必要があります。これには、パックされていないもの全体を保持するのに十分な物理 RAM が必要です。

次の 2 つのオプションがあります。

  1. メッセージを多くのチャンクに分割します。Cap'n Proto メッセージは自己区切りなので、一度に複数のメッセージをファイルに書き込み、後で同じ順序で一度に 1 つずつ読み返すことができます。

  2. パック形式を使用しないでください。メッセージがパックされていない場合は、パックできmmap()ます。次に、オペレーティング システムは、アクセス時にパーツをメモリに読み込み、後で必要に応じてメモリからフラッシュして戻すことができます。この場合、読み取りは簡単ですが、ファイルの最初の書き込みは注意が必要です。おそらく、ファイルを書き込んでいるプロセスに、メモリ内にファイル全体のスペースがありません。Cap'n Proto は現在 mmap による書き込みをサポートしていません (書き込み可能な mmap には問題があります) が、通常は別の方法があります: おそらく、メッセージの大きなチャンクは、実際にはいくつかの入力ファイルから直接発信されています。他のファイルからのブロブ。この場合、これらの各ファイルで mmap() を使用して、メッセージに組み込むことができます。capnp::Orphanage::referenceExternalData(). この方法では、すべてのファイルが同時にメモリ常駐である必要はありません。OS は、最終的な出力が書き込まれているときに、順番にそれぞれをページインおよびページアウトします。詳細とサンプルコードについては、この回答を参照してください。

于 2016-02-11T04:35:08.877 に答える