ファイルの「スパース性」を出力する方法は?

ファイルの「スパース性」を出力する方法は?

ファイルの名目サイズに実際にどれだけのデータがいっぱいになっているかを出力するにはどうすればよいですか?vmtouch現在のメモリにいくつのファイルがあるかを表示するのと同じです。

私はワークフローを次のようにしたいと思います。

$ fallocate -l 1000000 data 
$ measure_sparseness data
100%
$ fallocate -p -o 250000 -l 500000  data
$ measure_sparseness
50%

回避策:du -bshdu -shを使用して比較します。

答え1

find%S「スパース性」とも呼ばれる形式指定子があります。

         %S     File's  sparseness.   This  is  calculated as (BLOCKSIZE*st_blocks / st_size).  The exact value you will get for an ordinary file of a certain
                 length is system-dependent.  However, normally sparse files will have values less than 1.0, and files which use indirect  blocks  may  have  a
                 value which is greater than 1.0.   The value used for BLOCKSIZE is system-dependent, but is usually 512 bytes.   If the file size is zero, the
                 value printed is undefined.  On systems which lack support for st_blocks, a file's sparseness is assumed to be 1.0.
$ fallocate -l 1000000 data
$ find data -printf '%S\n'
1.00352
$ fallocate -p -o 250000 -l 500000  data
$ find data -printf '%S\n'
0.507904

答え2

そのオプションがない場合、find70年代以降にUNIXで動作していた方法は次のとおりです。

ls -ls file

これにより、使用された実際のブロック数と記録された最大バイト数が印刷されます。これにより、実際に割り当てられていないまま残っているブロック数を簡単に計算できます。

答え3

findは単純な出力を印刷しますが、詳細については、オープンソースとgithubで私が書いたものをチェックすることをお勧め%Sします。sparsetestここ。たとえば、すべての穴を印刷するには、それを自由に変更します。

希少な割り当ての問題を示すブログ投稿ここ問題デバッグに使用されますsparsetest

関連情報