Questão Por que existe uma diferença tão grande entre “Tamanho” e “Tamanho no disco”?


Como você pode ver abaixo, há muita diferença entre o Tamanho e Tamanho no disco campos na minha pasta. Por que é que?

Screenshot showing 50,875 files in 1,504 folders, 105 MB being 1.43 GB on disk

Eu sei disso Tamanho no disco deve ser um pouco mais de Tamanho por causa de unidades de alocação no Windows, mas por que muita diferença? Poderia ser por causa do grande número de arquivos?

BTW, esta pasta está no cartão SD do meu telefone Android. Dentro disso, meu aplicativo de mapas armazena seus mapas em cache e o aplicativo obtém seu mapa do Google Maps.


295


origem


Olá thelastblack e bem-vindo ao SuperUser. Editei sua pergunta para remover a parte sobre desfragmentação, já que as duas respostas existentes se concentram no tamanho / tamanho da discrepância de disco e o formato do Stack Exchange funciona melhor quando cada pergunta postada é sobre uma única coisa. Você certamente pode voltar a perguntar isso como uma questão separada, embora eu pense que as respostas que você recebeu até agora sobre essa questão mostram que a desfragmentação não vai ajudá-lo. (Geralmente também não adianta a mídia em estado sólido). Sinta-se à vontade para editar sua pergunta ainda mais se você sentir que eu mudei sua intenção de alguma forma. - Michael Kjörling
@ MichaelKjörling Heh, acabei de editar em uma pequena discussão sobre fragmentação (me distrai um pouco mais cedo) - Bob
@ MichaelKjörling Não faça Edite perguntas retroativamente para ajustar as respostas. Uma das respostas aborda a parte de fragmentação da questão do OP. Sua edição precisa ser revertida para evitar confusão. - DanteTheEgregore
@DanteTheEgregore Se você está se referindo à resposta de Bob, que de fato foi editada para também discutir os efeitos da fragmentação, então antes de pular a arma, por favor, verifique os históricos de edição e os registros de data e hora na resposta e na pergunta. No momento da minha edição, a resposta de Bob não cobria a questão da fragmentação. Se o OP quiser fazê-lo, editar de novo em "desfragmentará a mídia me ajudará com isso?" deve resolver qualquer confusão excepcional, embora eu ainda me sinta isso é melhor perguntado como uma questão separada; IMO a questão da diferença entre os dois valores não está relacionada. - Michael Kjörling
Parece-me que este aplicativo está seriamente mal programado - considere arquivar um relatório de bug. Eu não sou de forma alguma um programador profissional, mas uma vez eu hackeei algo semelhante no JavaME, e é claro que um dos problemas que tive para resolver foi como armazenar eficientemente todos esses pequenos blocos de mapas (armazenamento e acesso) em um container. Acabei usando arquivos zip descompactados. - A. Donda


Respostas:


Eu estarei assumindo que você está usando o sistema de arquivos FAT / FAT32 aqui, já que você mencionou que este é um cartão SD. O NTFS e o exFAT comportam-se de forma semelhante no que diz respeito às unidades de atribuição. Outros sistemas de arquivos podem ser diferentes, mas eles não são suportados no Windows.

Se você tem muitos arquivos pequenos, isso é certamente possível. Considere isto:

  • 50.000 arquivos.

  • Tamanho do cluster de 32 kB (unidades de alocação), que é o máximo para FAT32

Ok, agora o mínimo o espaço ocupado é de 50.000 x 32.000 = 1,6 GB (usando os prefixos do SI, não os binários, para simplificar as contas). O espaço que cada arquivo ocupa no disco é sempre um múltiplo do tamanho da unidade de alocação - e aqui estamos assumindo que cada arquivo é realmente pequeno o suficiente para caber dentro de uma única unidade, com algum espaço (desperdiçado) sobrando.

Se cada arquivo tiver uma média de 2 kB, você terá cerca de 100 MB no total - mas também está perdendo 15x (30 kB por arquivo), em média, devido ao tamanho da unidade de alocação.


Explicação detalhada

Por que isso acontece? Bem, o sistema de arquivos FAT32 precisa manter o controle de onde cada arquivo está armazenado. Se fosse para manter uma lista de cada byte, a tabela (como um catálogo de endereços) cresceria na mesma velocidade que os dados - e gastaria muito espaço. Então, o que eles fazem é usar "unidades de alocação", também conhecidas como "tamanho do cluster". O volume é dividido nessas unidades de alocação e, no que diz respeito ao sistema de arquivos, elas não podem ser subdivididas - esses são os menores blocos que podem ser endereçados. Assim como você tem um número de casa, mas seu carteiro não se importa com quantos quartos você tem ou quem mora neles.

Então, o que acontece se você tiver um arquivo muito pequeno? Bem, o sistema de arquivos não se importa se o arquivo for 0 kB, 2 kB ou até 15 kB, ele dará o menor espaço possível - no exemplo acima, isto é 32 kB. Seu arquivo está usando apenas uma pequena quantidade deste espaço, e o resto é basicamente desperdiçado, mas ainda pertence ao arquivo - muito parecido com um quarto que você deixa desocupado.

Por que existem tamanhos diferentes de unidades de alocação? Bem, isso se torna uma troca entre ter uma mesa maior (livro de endereços, por exemplo, dizer que John é dono de uma casa na 123 Fake Street, 124 Fake Street, 666, etc.) ou mais espaço desperdiçado em cada unidade. Se você tiver arquivos maiores, faz mais sentido usar unidades de alocação maiores - porque um arquivo não recebe uma nova unidade (house) até que todos os outros sejam preenchidos. Se você tem muitos arquivos pequenos, bem, você vai ter uma grande mesa (livro de endereços) de qualquer maneira, assim também pode dar-lhes pequenas unidades (casas).

Grandes unidades de alocação, como regra geral, desperdiçarão muito espaço se você tiver muitos arquivos pequenos. Geralmente não há uma boa razão para ir acima de 4 kB para uso geral.


Fragmentação

Quanto à fragmentação, a fragmentação não deve desperdiçar espaço dessa maneira. Arquivos grandes podem ser fragmentados, isto é, divididos em várias unidades de alocação, mas cada unidade deve ser preenchida antes que a próxima seja iniciada. A desfragmentação pode economizar um pouco de espaço nas tabelas de alocação, mas esse não é seu problema específico.


Soluções possíveis

Como gladiator2345 sugerido, suas únicas opções reais neste ponto são viver com isto ou reformatar com unidades de alocação menores.

Seu cartão pode ser formatado em FAT16, que tem um limite menor no tamanho da tabela e, portanto, requer unidades de alocação muito maiores para endereçar um volume maior (com um limite superior de 2 GB com unidades de alocação de 32 kB). Fonte cortesia de Braiam. Se for esse o caso, você deve ser capaz de formatar com segurança como FAT32 de qualquer maneira.


299



O espaço desperdiçado devido a tamanhos mínimos de alocação é tecnicamente chamado de "fragmentação interna", então você poderia dizem que a fragmentação é o culpado. Mas ainda não é algo que qualquer ferramenta de "desfragmentação" possa fazer. - hobbs
(Menos tecnicamente, é apenas chamado de "folga".) - hobbs
Tamanhos de cluster também limitam o tamanho máximo do sistema de arquivos. Por exemplo, se o seu espaço de endereçamento for 32 bits, você terá um total de ~ 4.29 bilhões de clusters totais possíveis. Agora, se você usar o menor tamanho de cluster suportado por NTFS (512 bytes), poderá endereçar um máximo de 512 * 2 ^ 32 bytes = 2 GiB. Se você precisar de um volume que possa armazenar mais de 2 GiB de dados, será necessário aumentar o tamanho do cluster. Isso é tudo independente do maior arquivo real que você tenta armazenar, pois não é possível armazenar um arquivo com mais de 2 GiB que seja o menor dos seus problemas. - Andon M. Coleman
4 clusters KiB permitem endereçar arquivos em um volume de até 16 TiB de tamanho, o que deve ser suficiente para o futuro previsível. - Andon M. Coleman
Bem, ele poderia compactar seu arquivo de arquivos pequenos em um arquivo grande. - einpoklum


Essa é uma daquelas situações em que compactar / arquivar em um único arquivo pode ajudar. o que Bob disse em sua resposta é verdade mas a solução pode ser mais fácil do que reformatar o disco como outras respostas sugerem. Se você compactar ou arquivar o diretório (usando zip, tar ou qualquer outro método), o sistema de arquivos verá que você tem um único arquivo grande, em vez de vários arquivos menores. Mesmo sem compactar, você receberá de volta quase 1,4 GiB de espaço, porque todos esses "arquivos pequenos" serão contados como um único arquivo grande.

Dentro disso, meu aplicativo de mapas armazena seus mapas em cache e o aplicativo obtém seu mapa do Google Maps

Talvez você deva discutir com o desenvolvedor para usar um arquivo ou um banco de dados em vez de vários arquivos. Isso provavelmente também ajudará a ter o disco menos fragmentado e certamente economizará espaço, especialmente se for uma unidade flash NAND. Se você explicar a ridícula situação em que 100 MB de carga útil / dados úteis se tornam 1,4 GIB, há algo errado com a forma como os dados são armazenados e os desenvolvedores devem trazer uma solução melhor.


46



> Dentro deste, meu aplicativo de mapas armazena seus mapas em cache e o aplicativo obtém seu mapa do Google Maps. - infelizmente, nesse caso, a compactação (que é efetivamente um sistema de arquivos acima do de base) exigiria suporte desse aplicativo de mapeamento. - Bob
@Bob, então a solução deve vir do lado do desenvolvedor D: - Braiam
Isso é totalmente verdade. Acho que, por enquanto, devo mudar meu aplicativo. - vfsoraki
@Braiam Não está enganando o sistema de arquivos para pensar que existe apenas um arquivo; há é apenas um arquivo. Quanto ao motivo pelo qual os desenvolvedores não armazenam as informações do cache em um arquivo, provavelmente é porque a maioria dos formatos de arquivo não são projetados para gravações aleatórias rápidas, que um cache certamente precisa. Uma alternativa melhor pode ser usar uma biblioteca de banco de dados leve como o SQLite. - bcrist
Absolutamente verdadeiro ..... +1 - arundevma


Caso alguém seja confrontado com este problema, pode ser útil também saber que outro motivo para ver grande diferença no tamanho / espaço do arquivo no disco é o uso de fluxos de dados alternativos (PUBLICIDADES)

Isso se aplica somente ao NTFS ao meu conhecimento. Os anúncios são conhecidos por usos legítimos e não legítimos:

  • para marcar um arquivo baixado da Internet
  • armazenar metadados (a Microsoft queria incluir alguns recursos do sistema operacional Apple, como não usar a extensão de arquivo para determinar o tipo de arquivo)
  • ocultar dados ou código no contexto de um malware.

ADS simplesmente: qualquer arquivo NTFS pode conter múltiplos fluxos de dados (entender "subarquivos"). Um deles é o fluxo principal, usado pelo Windows Explorer e outras ferramentas do Windows, ele contém o conteúdo usual de um arquivo. Fluxos de dados alternativos podem conter outras informações, exatamente como o fluxo principal, mas não podem ser manipulados diretamente por ferramentas do Windows (em particular, o Explorer exibe o tamanho do arquivo como igual ao tamanho do fluxo principal, independentemente do tamanho do ADS), você tem que usar ferramentas especializadas ou código para escrever, ler e localizar ADS.

O ponto principal é que, no caso de grandes diferenças de tamanho de arquivo observadas, não subestime a possibilidade de ADS e malware oculto.

Outro link.

Para experimentar com segurança o ADS, tente isso no nível DOS / CMD ...

Crie e exiba o conteúdo de um arquivo na raiz de C:

C:\> echo The main data stream> test.txt
C:\> type test.txt

Resultado:

C:\> The main data stream

Agora adicione um ADS com o mesmo método, apenas especifique o nome do ADS além do nome do arquivo:

C:\> echo The secret message> test.txt:secret

Você acabou de esconder a mensagem secreta no arquivo. Observe que o tamanho do arquivo no Explorer não mudou, apesar de termos adicionado bytes no "segredo" do ADS.

Tente exibir o conteúdo do ADS:

C:\> type test.txt:secret

Resultado:

The filename, directory name, or volume label syntax is incorrect.

CMD type não é capaz de exibir o conteúdo do ADS. Nós usaremos o Notepad:

notepad test.txt:secret

No bloco de notas, podemos ver o conteúdo do ADS:

The secret message

Você também pode ocultar um executável completo em um ADS de um arquivo de texto inocente e executá-lo a qualquer momento. A riqueza não prejudica os hackers :-)


25



Eu não sou um homem vencedor, meu trabalho é feito principalmente no Linux. Isso foi muito útil. Obrigado - vfsoraki
Vale a pena usar uma ferramenta como Streams de Sysinternals para verificar o uso de ADS. Por exemplo, arquivos baixados em um sistema Windows podem ser marcados com uma fonte em ADS, embora isso seja pequeno e não deva ocupar espaço. Ele não será exibido no diretório ou na saída do Explorer normalmente. Pode levar blocos e agravar o problema de uso do disco que você está investigando. . - adric


O problema pode ser devido ao tamanho do cluster.

De acordo com Microsoft:

Se você não estiver usando compactação NTFS para quaisquer arquivos ou pastas   contido no volume, a diferença entre TAMANHO e TAMANHO NO DISCO   é um espaço desperdiçado devido a um tamanho de cluster maior que o necessário. Você   deve tentar usar um tamanho de cluster ideal para que o TAMANHO NO DISCO   O valor é o mais próximo possível do valor SIZE. Excessivo   discrepância entre o SIZE ON DISK eo valor SIZE é um   indicação de que o tamanho do cluster padrão é muito grande para a média   tamanho do arquivo que você está armazenando no volume e que ele deve ser   diminuído. Isso pode ser feito apenas fazendo o backup do volume e, em seguida,   reformatar o volume usando o comando format e a opção / a   para especificar o tamanho de alocação apropriado: IE: format D: /a:2048   (Este exemplo usa um tamanho de cluster de 2 KB).

Tente formatar sua unidade com tamanho de cluster menor.


19



Dito isto, não se deve criar um tamanho de cluster inferior a 4096 bytes ou simplesmente não multiplicar esse número. O SO de 32 bits funciona com páginas que (em casos não-PAE) são de 4096 bytes, portanto, o uso de clusters não múltiplos pode afetar negativamente o desempenho do sistema de arquivos. É por isso que o tamanho padrão é definido para 4096 bytes. - Ruslan
Para adicionar ao que @Ruslan disse, os discos rígidos mais novos agora têm um tamanho de setor de 4 kB, e seria ótimo alinhar o sistema de arquivos aos setores físicos e ter um múltiplo do tamanho do setor físico como o tamanho da unidade de alocação. - Bob
@Ruslan Eu acredito que você quer dizer que deve ser uma potência de duas vezes 4096. 12288 (3 × 4096) e 20480 (5 × 4096) não são ótimas opções. - Scott


Eu vejo muitas pessoas recomendando reformatar sua unidade com um tamanho de cluster menor. Como este é um cartão SD, observe que muitos fornecedores pré-formatam a placa no tamanho de cluster recomendado para corresponder ao tamanho do cluster da NAND (manter ambos em sincronia é muito importante para um desempenho ideal de leitura / gravação e redução do desgaste)

Você não pode alterar o tamanho do cluster NAND (é um atributo físico do hardware do seu cartão SD).

Primeiro, execute scandisk / chkdsk no seu cartão SD para ter certeza de que o problema de relatório de tamanho não está dentro de um sistema de arquivos corrompido.

Em segundo lugar, sugiro que você denuncie o bug para os desenvolvedores do Google Map, pois eles são os culpados aqui. Eles devem estar usando um método de armazenamento superior. A correção também deve fazer com que o aplicativo seja executado mais rapidamente em muitos dispositivos devido à menor atividade de E / S e do driver do sistema de arquivos.


9



Na verdade, não foi o Google Maps, mas outro aplicativo usando os mapas do Google. Eu informei o desenvolvedor e apenas removi esses arquivos do meu SD. - vfsoraki


Este é um problema geral com muitos sistemas de arquivos. Existem dois fatores em funcionamento aqui, o número máximo de "blocos" que um sistema de arquivos pode manipular por volume lógico e restrições físicas do meio de armazenamento. Apenas 1 arquivo pode ser alocado para qualquer bloco (arquivos geralmente levam quantos blocos forem necessários). Portanto, um arquivo de texto com 64 bytes pode levar algo de 4k a 32k, dependendo do tamanho do bloco do sistema de arquivos no qual ele reside.

Uma maneira de pensar sobre isso é pensar em cada bloco no sistema de arquivos como uma caixa e no sistema de arquivos como uma sala. Todas as suas caixas são do mesmo tamanho e você tenta encaixar o máximo que puder em uma sala. Se você colocá-los todos com mais espaço sobrando, você tem que obter caixas maiores para que a sala fique cheia de caixas.

Uma das regras para colocar coisas em caixas é que você não pode colocar duas coisas não relacionadas em uma caixa. Eles precisam fazer parte do mesmo documento. Então, se eu fosse digitar uma página de texto, ela teria sua própria caixa. Se meu texto digitado tivesse tantas páginas, eu não conseguiria encaixar tudo em uma caixa, eu simplesmente encontraria outra caixa e continuaria colocando páginas lá, repetindo até que eu arqueasse todas as minhas páginas. Eu também escrevi as caixas que usei para o documento e a ordem das caixas para lê-lo em seqüência.

Dependendo de como eu organizaria as caixas, posso ter apenas espaço suficiente no meu manifesto para um determinado número de caixas. Então, se eu tivesse uma grande sala para preencher, mas apenas um pequeno número de caixas, teria que usar caixas muito grandes para alcançar a capacidade da sala.

Então, nesse caso, meu documento de uma página ainda ocuparia uma única caixa, com nada mais compartilhando.

As mesmas situações ocorrem entre várias soluções de armazenamento. O FAT32 só pode gerenciar o que é considerado um número baixo de "caixas" nos enormes discos rígidos de hoje, então ele acaba com "caixas" muito grandes para compensar isso.


7





Além dos tamanhos de cluster, você também pode ter uma discrepância devido às seguintes condições:

  • Arquivos compactados ou criptografados podem usar um espaço diferente do tamanho do arquivo lógico.
  • Arquivos vinculados reportarão n vezes o número de links vezes o tamanho do arquivo para o tamanho do arquivo lógico, mas o espaço físico usado é geralmente menor.

6



Geralmente, isso pode ser verdade. Mas no meu caso, alta unidade de alocação foi o problema. - vfsoraki
Sim, estou apenas tentando adicionar à resposta, dando mais razões possíveis para a discrepância. - Archimedes Trajano


Você deve dar uma olhada na entrada Bloquear Subalocação na Wikipedia. Isso é exatamente o que está acontecendo com você. Usar um sistema de arquivos com suporte para Tail Packaging é uma solução em nível de sistema de arquivos para esse problema, além de alterar o tamanho do cluster de alocação.

Todos têm o inconveniente de precisar reformatar o disco.

Em alguns casos, simplesmente armazenar esses arquivos em um arquivo resolveria o problema (e os arquivos pequenos também seriam compactados ao lado de parar de perder espaço no final dos arquivos). Isso tem o inconveniente de passar algum tempo para descompressão.

Outra opção se você tiver tantos arquivos pequenos devido a algum problema relacionado ao aplicativo específico é armazenar seus dados de software usando outro método (pode estar em um banco de dados). Mas é claro que é uma solução para programadores, não para usuários finais.

http://en.wikipedia.org/wiki/Tail_packing


6