2016-09-09 18 views
0

ファイルサイズが16 ... 128 MBの連続ブロックをファイルに配置する必要があります。ファイル構造が矛盾した状態になることはありません(停電やプロセスの停止の場合)。128MBをアトミックにファイルに書き込む方法は?

ファイルの整合状態は、古いデータが使用可能であり、書き込みが失敗したために消費された領域を再利用できることを保証します。言い換えれば、ソフトウェアの書き込みに失敗しても(ディスクユニットが正常であると仮定して)、いつでも「良いデータ」と「ゴミ」というカテゴリの間でファイルの各部分を区別する必要があります。

ファイル内の最も単純なデータ構造と、それを提供するためにどのようなアルゴリズムを提案できますか?

関連する質問:DBMS(MySQLのInnoDB、MongoDB、Redisなど)は、生のHDD(Oracle)の上にあるものではなく)ファイルシステムの上で動作するものは、同様の問題をどのように処理しますか?

+4

これは、オペレーティングシステムおよび/または基礎となるファイルシステムによって異なります。単純に「できません」または「簡単ではありません」という回答が得られる可能性があります。 – inetknght

+7

一時ファイルに書き込んで名前を変更します。前のファイルを上書きします。 –

+1

[ジャーナリングファイルシステム](https://en.wikipedia.org/wiki/Journaling_file_system)には、この機能が組み込まれています。ジャーナリングファイルシステムを使用している場合は、何もする必要はありません。 – IInspectable

答えて

1

上書きするか追加するかによって、いくつかのアプローチがあります。あなたがコメントで示唆されているとして、上書き行いたい場合は

を上書き

。あなたのコンテンツを一時ファイルに書き出し、一時ファイルを元のファイルにコピーします。書き込みの開始時に一時ファイルが存在する場合は、何かが間違っていることがわかりますので、破棄する必要があります。そうでない場合、正常に進めることができます。

付記

この1つは、よりトリッキーです。書き込む前にできることは、コンテンツには表示されない文字列をファイルに追加することです。その文字列の後に続くものは、文字列が削除されるまで(書き込みの最後に行われる)「疑わしい」とみなされます。ファイル内の文字列を書き出して検出する場合は、その文字列の後ろにある文字列を疑わしいものとして削除することもできます。あなたがそれに遭遇しなければ、あなたはそれを普通のように書くことができます。

+1

それは、原子性について考えるための、まさに素朴な方法です。ガードストリングが途中まで書き込まれた場合、電源が落ちた場合はどうなりますか?ファイルのどの部分が有効なコンテンツをもはや保持しているかどうかを知る方法はありません。いいえ、これは単にこのようには機能しません。同様に、同じ理由でコピーメソッドが破損しています。 – IInspectable

1

これはOSによって異なります。しかし、一般的には、ファイルの最後に書き込むために、バッファされていないIOを使用する必要があります。それが成功すると、新しいレコードが完了したことを示すいくつかのタイプのヘッダー情報が更新されます。あなたは余分な信頼性のために一時ファイル交換と組み合わせることができます。

関連する問題