2

共有メモリにあるデータを操作するプログラムを開発しています。プログラムはレイテンシーを要求し、膨大な量のデータを処理します。

プログラムが失敗した場合、最後の作業状態にすばやく戻らなければなりません。

1 つの方法は、その日の開始からのトランザクションを含むトランザクション ログからデータを読み取って処理することです。しかし、トランザクション ログのサイズ (数百ギガバイト) を考慮すると、これはまったく高速ではありません。

現在、プログラムが失敗した場合にディスクに書き込み、非常に高速に読み取ることができるデータのスナップショットを作成する方法を探しています。ただし、スナップショットの作成によってプログラムの実行がロックされてはならず、そのスナップショット内のデータは一貫している必要があります。

共有メモリの代わりにデータを保持するためにローカル メモリを使用していた場合、解決策は簡単です。

  1. フォーク()
  2. データをディスクに書き込む

Linuxのコピーオンライトにより、変更されたデータのみがコピーされるため、非常に高速です。

ただし、posix 共有メモリを使用しています。

速度と一貫性を念頭に置いてそれを行う方法はありますか?

4

1 に答える 1

0

memcpy() のために十分な CPU サイクルを確保できる場合は、次のことができます。

  1. フォーク()
  2. 共有メモリをロックする
  3. memcpy (shared_mem -> some_buffer)
  4. 共有メモリのロックを解除
  5. 好きな時間かけてディスクにデータを書き込む
于 2011-11-18T16:11:10.880 に答える