Arquivo esparso - Sparse file

Um arquivo esparso: Os bytes vazios não precisam ser salvos, portanto, podem ser representados por metadados .

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

  1. ^ Giampaolo, Dominic (1999). Projeto prático de sistema de arquivos com o sistema de arquivos Be (PDF) . Morgan Kaufmann Publishers . ISBN   9781558604971 .
  2. ^ "Guia do sistema de arquivos Apple" . Site para desenvolvedores da Apple . A Apple Inc . Retirado em 27 de abril de 2017 .
  3. ^ 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 .
  4. ^ Tridgell, Andrew (1996-06-29). "rsync: links físicos, melhor manuseio esparso, FERROR e FINFO" . Página visitada em 2016-06-17 .
  5. ^ Tridgell, Andrew (30/06/2016). "página de manual do rsync" . Recuperado em 19/01/2017 .
  6. ^ Davison, Wayne (2005-08-30). "rsync: Rejeita tentativas de combinar --sparse com --inplace" . Recuperado em 19/01/2017 .

links externos