(まばらな)ファイルからのチャンク読み取りがすべてゼロであるかどうかを迅速に判断する方法はありますか?
-
26-10-2019 - |
質問
ファイルから読み取られた(4kb-16Mb)チャンクがすべてゼロであるかどうかを迅速に判断する方法はありますか?
各バイトをチェックして、チャンクを反復させることができます。明らかな最適化がありますが、それはo(n)のままです。
私のユースケースは、スパースファイル用です。私は部分的なソリューションに完全に満足しているでしょう。そのため、私が読んだチャンクがディスクストレージ(つまり、穴)に裏打ちされていない場合、真実を返します。
ヒントはありますか?
解決
これは、オペレーティングシステムと場合によってはファイルシステムに依存します。 2.6.28が実装して以来のLinux FIEMAP
ioctl()
, 、およびsolarisのzfs SEEK_HOLE
と SEEK_DATA
の lseek()
.
他のヒント
私の最初の考えは、「Rsyncはどのようにそれをしますか?」でした。
rsyncは単にゼロのブロックをデータにチェックし、それらをスパースファイルとして書き込むことがわかります。見る fileio.c
Goryの詳細が必要な場合は、RSYNCソースコードで。
所属していません StackOverflow