Como eu produzo “sparseness” de um arquivo?

14

Como faço para saber quanto do tamanho nominal do arquivo é realmente preenchido com dados? Como vmtouch mostra quanto do arquivo está atualmente na memória ...

Espero que o fluxo de trabalho seja assim:

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

Solução alternativa: use du -bsh e du -sh e compare-os.

    
por Vi. 07.08.2016 / 00:17

3 respostas

18

find tem %S do especificador de formato que é chamado de "dispersão"

         %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
    
por 07.08.2016 / 00:17
1

Se o seu find não tiver essa opção, um método que funcione no UNIX desde os anos 70 é:

ls -ls file

Que imprimirá o número real de blocos usados e o maior byte já gravado. A partir disso, você pode calcular com facilidade quantos blocos realmente não foram alocados.

    
por 08.08.2016 / 00:58
0

Enquanto find %S imprimirá uma saída breve, para mais detalhes você pode querer ver sparsetest que eu escrevi - código aberto, e no github aqui . Sinta-se à vontade para modificá-lo se quiser imprimir (por exemplo) todos os buracos.

Artigo do blog mostrando problemas com alocações esparsas aqui usando sparsetest para depurar o problema.

    
por 07.08.2016 / 08:26