ファイルから読み取った (4KB-16MB) チャンクがすべてゼロかどうかをすばやく判断する方法はありますか?
各バイトをチェックして、チャンクを反復処理できます。明らかな最適化がありますが、O(N) のままです。
私のユースケースはスパースファイルです。私が読んだばかりのチャンクがどのディスクストレージにも支えられていない場合 (つまり、それが穴である場合)、true を返すような部分的な解決策があれば、私は完全に満足しています。
ヒントはありますか?
ファイルから読み取った (4KB-16MB) チャンクがすべてゼロかどうかをすばやく判断する方法はありますか?
各バイトをチェックして、チャンクを反復処理できます。明らかな最適化がありますが、O(N) のままです。
私のユースケースはスパースファイルです。私が読んだばかりのチャンクがどのディスクストレージにも支えられていない場合 (つまり、それが穴である場合)、true を返すような部分的な解決策があれば、私は完全に満足しています。
ヒントはありますか?
これは、オペレーティング システムと場合によってはファイル システムに依存します。2.6.28 以降の Linux は を実装しておりFIEMAP
ioctl()
、Solaris 上の ZFS は と を実装SEEK_HOLE
しSEEK_DATA
ていlseek()
ます。
私の最初の考えは、「rsyncはどのようにそれを行うのですか?」でした。
rsyncは単にデータのゼロのブロックをチェックし、それらをスパースファイルとして書き込むことがわかりました。fileio.c
厄介な詳細が必要な場合は、rsyncのソースコードを参照してください。