StandardOpenOption.SYNCとStandardOpenOption.DSYNC

  1. StandardOpenOptionとの違いは何ですか? .SYNC および StandardOpenOptionを参照してください。 DSYNC
  2. DSYNCでどのようなデータ損失が発生する可能性がありますか?
  3. DSYNCはどのユースケースに適していますか?既にファイルの内容を同期することを決めた場合、ファイルのメタデータの同期を忘れることをお勧めしますか?オーバーヘッドの相対的な差は無視できないでしょうか?
9

2 答え

ギリ、

DSYNCはSYNCのサブセットです。

SYNCでは、DSYNCがファイル・データだけを同期して書き出す必要がある間に、すべてのデータ(ファイル・システムによって管理されるファイル・データおよびファイル・メタデータ)が同期的に書き出されることが必要です。オーバーヘッドに関しては、私はそれが "ファイルシステムに依存する"巨大だと思う。コピーオンライト、シャドウコピー、バージョニング、チェックサムなどのコンセプトを使って、最新のファイルシステムを見てみましょう。私は、すべての作業が完了するまで、書き込み操作全体をブロックしてブロックすることはコストがかかると考えています。

データ損失の可能性は、提供するためのより混乱した答えです。非同期ファイルI/Oの利点は、基礎となるファイルシステムまたはディスクが実際にバッチまたは順序付け書き込みを行い、ランダムI/Oを回避し、書き込みをより逐次的に構造化できることです。

それは素晴らしいですが、あなたのデータ損失の問題に答えるために、潜在的に失われる可能性があるフラッシュの前にキャッシュに座っているペンディング書き込みがあります。要するに、言うことは難しい。

つまり、順序は次のようになります。

  1. (オプションなし) - まだフラッシュされていない1つ以上の保留中の書き込みから、ファイルデータとファイルメタが損失する可能性が最も高い。
  2. DSYNC - 遅く、ファイルデータが書き込まれ、返されるまで待ちます(後でファイルメタを保存します)。
  3. SYNC - 最も遅く、ファイルデータとファイルメタが書き出されるまで待ってから、戻る前にサムをアップします。

私は、これらすべての質問が新しい AsynchronousFileChannel (Java 7の場合);それが事実でないなら私の謝罪。

5
追加された

ここでは、Linuxファイルシステムに固有の答えを示します。

sun.nio.fs.UnixChannelFactory のソースによると、これらのオプションは、 O_SYNC O_DSYNC http://man7.org/linux/manage-manages/man2/open.2.html "rel =" nofollow "> open()、そのドキュメントには次のように書かれています。

fdatasync(2)のドキュメントでは、最終アクセス時刻最終更新時刻など、ファイルのデータを取得するのに重要でないことを明示しています。 em>は O_DSYNC によってフラッシュされませんが、それは次のようなものです:

fsync()は、変更されたすべてのコア内データを転送します(つまり、          ファイルによって参照されるファイルのための変更されたバッファキャッシュページ)          ディスクリプタfdをディスク装置(または他の永久記憶装置)          変更されたすべての情報を          システムがクラッシュしたか再起動しました。 ...コールはデバイスまでブロックされます          転送が完了したことを通知します。また、メタデータをフラッシュします          ファイルに関連する情報(stat(2)参照)。

     

fdatasync()はfsync()と似ていますが、変更したものをフラッシュしません          メタデータは、そのメタデータが          それ以降のデータ検索は正しく処理されます。例えば、          st_atimeまたはst_mtimeに変更されます(それぞれ、最後のアクセス時刻          最後の修正の時期。 stat(2)を参照)フラッシングを必要としない          後続のデータ読取りが必要ではないため          正しく処理されました。一方、ファイルサイズの変更          (st_sizeは、ftruncate(2)と同様に)、メタデータを必要とします          フラッシュします。

したがって、プログラムがこれらの重要でないデータ属性を使用しないように(そして値の同期が重要です)、 StandardOpenOption.DSYNC は許容されます。 ( SYNC DSYNC を選択すると、実際にどの程度のパフォーマンス上の利点があるか分かりませんが)

BasicFileAttributes を参照してください。 > creationTime() lastModifiedTime() lastAccessTime()などのフィールドは、 isDirectory() isRegularFile() is *() size()などのフィールドは、コード>おそらく、私は間違っている場合、データにアクセス可能であると想像することはできません。