如何输出文件的“稀疏”?


15

如何输出实际用数据填充了多少文件标称大小?就像vmtouch显示当前内存中有多少文件...

我希望工作流程是这样的:

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

解决方法:使用du -bshdu -sh并加以比较。


1
相关:filefrag对于任何文件系统和xfs_bmap -vplXFS都是关键工具,用于显示在处理稀疏文件和打孔时数据的位置(以及预分配的未写扩展区的位置)。
彼得·科德斯

filefrag data->多个FIBMAP: Invalid argument-> data: 1 extent found...
六。

在什么文件系统上? filefrag -e至少可以在XFS和ext4上完美运行。我还没有对其他人进行测试。它使用FIEMAP(扩展图),并回退到FIBMAP。如果这些ioctl不起作用,那么它将不会有用。
彼得·科德斯

在tmpfs上。我filefrag没有-e选择。
六。

你几岁了e2fsprogs?我很确定这不是最新功能。还有一个-v选项可以打印相同的详细信息(加上一些额外的标题行)。也许您filefrag会拥有。xfs_bmap但是,与不同,它没有明确地用单独的行指示孔,而只是文件位置不连续。无论如何,我不惊讶tmpfs不支持FIEMAP,因为没有块设备作为后备存储,因此扩展区的位置没有任何合理的价值。
彼得·科德斯

Answers:


19

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

有趣。系统上大多数常规文件的稀疏度将超过1.0,目录,软链接和套接字的精确度将始终为1.0。
grochmal

某些系统没有在根本不使用数据块的情况下直接在索引节点中保存(短)符号链接吗?想知道那应该是什么稀疏。此外,该定义不是正确的方法吗,正常(即非稀疏)文件的稀疏度肯定为零吗?:)
ilkkachu 2016年

@grochmal,在ext4(Linux)上ln -s foo link,“:稀疏”为link:0。套接字和FIFO的长度为零,因此find显示稀疏
1。– ilkkachu

1

如果您find没有该选项,那么从70年代开始在UNIX上可用的方法是:

ls -ls file

它将打印实际使用的块数和有史以来的最高字节。据此,您可以轻松计算出实际上尚未分配多少块。


0

虽然find%S将打印一个简短的输出,更多的细节,你可能想在看sparsetest我写的-开源的,并在GitHub上这里。如果您要打印(例如)每个孔,请随时对其进行修改。

博客文章显示有稀疏的分配问题,这里使用sparsetest调试问题。


它可以在文件中vmtouch -v打印范围的“地图”,就像在文件中打印缓存区域的地图吗?
六。

@Vi。我很早以前就写了它,却忘记了一些细节-它实际上是在创建一个稀疏文件,向其中写入数据,然后打印统计数据。您只需要统计信息创建位。要打印孔,您需要lseek使用SEEK_HOLESEEK_DATA。容易做。
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.