3

ファイルのセットがあるとします。これらすべてのファイルへの書き込みがアトミックであることを確認するにはどうすればよいですか。

一時ファイルへの書き込みを考えましたが、書き込みが成功した後にのみ、各ファイルのアトミックな名前変更を実行します。ただし、すべてのファイルの名前を一度に変更することはアトミックではありません。また、これらのファイルに追加したい場合、これは非常に大きなファイルには拡張できません。

代わりに、トランザクションを実装することを考えましたが、それ自体がプロジェクトになりつつあります。これはほとんどミニ データベースの実装に関するものだと認識しています。

Pythonでどのようにしますか?

d = FileWriter.open(['file1', 'file2'], 'wb+')
d.write('add hello world to files')
d.close()

d.write がアトミックであること、または失敗した場合は少なくとも元のファイルにロールバックすることを確認してください。

4

4 に答える 4

5

これが私が考えていることです。最初に open が同期されていることを確認してから、次の手順を実行します。

  1. 一時ファイルへの書き込み: file1~、file2~、および特殊ファイル success~ (最初に書き込む必要があります)。
  2. 書き込みが成功したら、ファイルを削除する success~.
  3. ファイルの名前を file1 および file2 に変更します。

何かが壊れた場合:

  1. success~ が存在するかどうかを確認します。
  2. その場合は、わざわざ修理しないでください。ファイルが更新されなかった (名前が変更されていない) ため、ロールバックが暗黙的に実行されました。
  3. success~ が存在しない場合は、書き込み後と名前の変更中に問題が発生しました。この場合、修復は filex~ の名前を filex に変更するのと同じくらい簡単です。
于 2012-08-18T23:27:11.943 に答える
1

現在のステートメントでは、要件は非常に一般的であるため、OSレベルのサポートが必要であるという唯一のもっともらしい答えがあり、厳密にはPython関連の質問でさえありません。たとえば、ここここで、トランザクションファイルシステムについての説明を参照してください。これまでに提案されたソリューションに関する小さな抜粋:

複数のファイルシステム操作間で一貫性を確保することは、ファイルシステムトランザクションがなければ、不可能ではないにしても困難です。ファイルロックは、個々のファイルの同時実行制御メカニズムとして使用できますが、通常、ディレクトリ構造やファイルメタデータは保護されません。たとえば、ファイルロックでは、シンボリックリンクでのTOCTTOUの競合状態を防ぐことはできません。また、ファイルロックでは、ソフトウェアのアップグレードなど、失敗した操作を自動的にロールバックすることはできません。これには原子性が必要です。

だから私はあなたの問題(そして多分あなたの質問も?)を再考し、あなたの要件をより詳細に分析することを提案します。肝心なのは、必要な保証が少なければ少ないほど、より簡単な解決策を見つけることができるということです。たぶん、ファイルロックのような単純なことで逃げることができるかもしれませんし、あるいはデータベースが必要になるかもしれません。

そういえば、アーキテクチャのコンポーネントがファイルにアクセスする必要があるためにファイルシステムについて考えている場合、通常のデータベースの上にファイルシステムのようなファサードを構築する方法としてFUSEについて考えたことはありますか?python-fuseの使用は簡単です。

于 2012-08-20T05:38:57.600 に答える
0

flockを使用して目標を達成することができます。を使用してPythonで実現できますfcntl.flockこれは単なる助言的な手段であることに注意してください。必要なものを本当に保証するには、厳密なロックをサポートするデータベースまたはファイルシステム/カーネルを試して使用する必要があります。

于 2012-08-18T23:10:07.623 に答える