Arquivo esparso - Sparse file
Na ciência da computação , um arquivo esparso é um tipo de arquivo de computador que tenta usar o espaço do sistema de arquivos de forma mais eficiente quando o próprio arquivo está parcialmente vazio. Isso é obtido escrevendo informações breves ( metadados ) que representam os blocos vazios no disco, em vez do espaço "vazio" real que constitui o bloco, usando menos espaço em disco. O tamanho total do bloco é gravado no disco como o tamanho real apenas quando o bloco contém dados "reais" (não vazios).
Ao ler arquivos esparsos, o sistema de arquivos converte de forma transparente os metadados que representam blocos vazios em blocos "reais" preenchidos com bytes nulos no tempo de execução. O aplicativo não tem conhecimento dessa conversão.
A maioria dos sistemas de arquivos modernos oferece suporte a arquivos esparsos, incluindo a maioria das variantes do Unix e NTFS . O HFS + da Apple não fornece arquivos esparsos, mas no OS X, a camada de sistema de arquivo virtual suporta armazená-los em qualquer sistema de arquivo compatível, incluindo HFS +. O Apple File System (APFS), anunciado em junho de 2016 na WWDC, também oferece suporte a eles. Arquivos esparsos são comumente usados para imagens de disco , instantâneos de banco de dados , arquivos de log e em aplicações científicas.
Vantagens
A vantagem dos arquivos esparsos é que o armazenamento só é alocado quando realmente necessário: o espaço em disco é salvo e arquivos grandes podem ser criados mesmo se não houver espaço livre suficiente no sistema de arquivos. Isso também reduz o tempo da primeira gravação, pois o sistema não precisa alocar blocos para o espaço "ignorado". Se a alocação inicial requer a gravação de todos os zeros no espaço, também evita que o sistema tenha que gravar sobre o espaço "pulado" duas vezes.
Por exemplo, uma imagem de máquina virtual com tamanho máximo de 100 GB com 2 GB de arquivos realmente gravados exigiria 100 GB completos quando apoiados por armazenamento pré-alocado, mas apenas 2 GB em um arquivo esparso. Se o sistema de arquivos suportar perfuração e o sistema operacional convidado emitir comandos TRIM , a exclusão de arquivos no convidado reduzirá o espaço necessário.
Desvantagens
As desvantagens são que arquivos esparsos podem ficar fragmentados ; os relatórios de espaço livre do sistema de arquivos podem ser enganosos; encher sistemas de arquivos contendo arquivos esparsos pode ter efeitos inesperados (como erros de disco cheio ou cota excedida ao meramente sobrescrever uma parte existente de um arquivo que por acaso era esparso); e copiar um arquivo esparso com um programa que não os suporta explicitamente pode copiar todo o tamanho descompactado do arquivo, incluindo as seções zero que não são alocadas no disco - perdendo os benefícios da propriedade esparsa no arquivo. Arquivos esparsos também não são totalmente suportados por todos os softwares ou aplicativos de backup. No entanto, a implementação do VFS contorna as duas desvantagens anteriores. Carregar executáveis no Windows de 32 bits (exe ou dll) que são esparsos leva muito mais tempo, pois o arquivo não pode ser mapeado na memória no espaço de endereço de 4 GB limitado e não é armazenado em cache, pois não há caminho de código para o cache de executáveis esparsos de 32 bits (Windows em Arquiteturas de 64 bits podem mapear executáveis esparsos). No arquivo NTFS esparso (ou melhor, suas áreas diferentes de zero) não podem ser compactados. O NTFS implementa a dispersão como um tipo especial de compactação, de modo que um arquivo pode ser esparso ou compactado.
Arquivos esparsos no Unix
Arquivos esparsos são normalmente tratados de forma transparente para o usuário. Mas as diferenças entre um arquivo normal e um arquivo esparso tornam-se aparentes em algumas situações.
Criação
O comando Unix
dd of=sparse-file bs=5M seek=1 count=0
criará um arquivo de cinco mebibytes de tamanho, mas sem dados armazenados no disco (apenas metadados ). ( GNU dd
tem este comportamento porque chama ftruncate
para definir o tamanho do arquivo; outras implementações podem simplesmente criar um arquivo vazio.)
Da mesma forma, o comando truncate pode ser usado, se disponível:
truncate -s 5M <filename>
No Linux , um arquivo existente pode ser convertido em esparso por:
fallocate -d <filename>
Infelizmente, não existe uma maneira portátil de fazer furos; o syscall é fallocate (FALLOC_FL_PUNCH_HOLE) no Linux, fcntl (F_FREESP) no Solaris .
Detecção
A -s
opção do ls
comando mostra o espaço ocupado em blocos.
ls -ls sparse-file
Alternativamente, o du
comando imprime o espaço ocupado, enquanto ls
imprime o tamanho aparente. Em algumas versões não padrão de du
, a opção --block-size=1
imprime o espaço ocupado em bytes em vez de blocos, para que possa ser comparado com a ls
saída:
du --block-size=1 sparse-file
ls -l sparse-file
Além disso, a ferramenta filefrag
do e2fsprogs
pacote pode ser usada para mostrar detalhes de alocação de bloco do arquivo.
filefrag -v sparse-file
Copiando
Normalmente, a versão GNU do cp
é boa em detectar se um arquivo é esparso, então
cp sparse-file new-file
cria um novo arquivo, que será esparso. No entanto, GNU cp tem uma --sparse
opção. Isso é especialmente útil se um arquivo contendo blocos de zero longos for salvo de uma maneira não esparsa (ou seja, os blocos de zero foram gravados totalmente no disco). O espaço em disco pode ser economizado fazendo:
cp --sparse=always file1 file1_sparsed
Algumas implementações cp, como o cp do FreeBSD , não suportam a --sparse
opção e sempre expandirão arquivos esparsos. Uma alternativa parcialmente viável nesses sistemas é usar rsync com sua própria --sparse
opção em vez de cp. Infelizmente --sparse
não pode ser combinado com --inplace
.
Via entrada padrão
cp --sparse=always /proc/self/fd/0 new-sparse-file < somefile
Veja também
Referências
- ^ Giampaolo, Dominic (1999). Projeto prático de sistema de arquivos com o sistema de arquivos Be (PDF) . Morgan Kaufmann Publishers . ISBN 9781558604971 .
- ^ "Guia do sistema de arquivos Apple" . Site para desenvolvedores da Apple . A Apple Inc . Retirado em 27 de abril de 2017 .
- ^ Jim Meyering (1995-12-21). "GNU coreutils / cp: Aceita a nova opção, --sparse = {never, auto, always}, para controlar a criação de arquivos esparsos" . Página visitada em 2016-06-17 .
- ^ Tridgell, Andrew (1996-06-29). "rsync: links físicos, melhor manuseio esparso, FERROR e FINFO" . Página visitada em 2016-06-17 .
- ^ Tridgell, Andrew (30/06/2016). "página de manual do rsync" . Recuperado em 19/01/2017 .
- ^ Davison, Wayne (2005-08-30). "rsync: Rejeita tentativas de combinar --sparse com --inplace" . Recuperado em 19/01/2017 .
links externos
- Arquivos NTFS esparsos para programadores
- Criação de arquivos esparsos no Windows Server usando fsutil
- Criação de arquivos esparsos no Solaris usando mkfile (1M)
- Ver o tamanho do arquivo esparso de um instantâneo do banco de dados
- SEEK_HOLE ou FIEMAP: detectando buracos em arquivos esparsos
- virtsync é uma solução comercial para rsync
--sparse
e--inplace
problema. - SparseChecker - Utilitário que permite gerenciar os arquivos esparsos no sistema de arquivos NTFS
- Phantom - um programa para converter arquivos em arquivos esparsos para reduzir o espaço em disco
- Wiki do ArchLinux: arquivo esparso