Cópia contígua - Como faço para copiar arquivos contiguamente?

4

Eu quero copiar vários arquivos em uma unidade flash para que cada arquivo individual seja contíguo. Eles não precisam ser contíguos entre si e podem estar em qualquer ordem. Os arquivos serão muito grandes - centenas de megabytes, para gigabytes. Nenhum outro arquivo na unidade deve ser desfragmentado; fazer isso desperdiçaria tempo e causaria desgaste desnecessário na mídia flash.

Eu quero ser capaz de fazer isso por pelo menos FAT32, mas métodos para *nix filesystems também serão apreciados.

Essencialmente, existem duas abordagens para isso:

  • Copie e desfragmente os arquivos.
  • Desfragmentar espaço livre contíguo suficiente para cada arquivo e, em seguida, copiar cada arquivo em seu lugar.

A 2ª opção geralmente seria muito mais rápida do que a 1ª, e evitaria desgaste desnecessário na mídia flash, então a 2ª opção seria muito preferível.

Eu não me importo com soluções que funcionam offline, mas obviamente on-line é preferível.

    
por James Haigh 20.06.2013 / 04:24

2 respostas

3

Eu tenho que admitir que eu realmente não entendo o que você está tentando fazer, mas eu não acho que isso importe. Eu encontrei esta ferramenta chamada defragfs , que pretende fazer o que você está perguntando (se eu entendi o que você está tentando fazer).

link

Acho que a coisa com essa ferramenta é que ela defrags após , onde eu acho que você está essencialmente garantindo que, à medida que você escreve o arquivo em disco, isso é feito forma seqüencial. De acordo com este StackOverflow Q & A intitulado: como para armazenar um arquivo no bloco de disco contínuo no linux , não parece que é possível, dada a arquitetura de como as gravações são feitas.

Apenas para completar este Q & A, encontrei os seguintes recursos que parecem ser úteis.

por 20.06.2013 / 04:53
3

É possível, pelo menos, para o FAT32, no entanto, não lembro o nome da ferramenta.

Se bem me lembro, o certo é baseado em uma primeira chamada para um furo de comprimento total e atribuí-lo ao novo fluxo, então o arquivo é lido e escrito nesse fluxo.

Também é possível com o NTFS através da cópia de pré-alocação, se bem me lembro.

Mas, para arquivos compactados NTFS, não há como ... já que o Windows primeiro escreve o arquivo (não-compactado) e depois ele compacta o arquivo em partes ... para dizer a verdade, ele faz isso em um pipeline. .. essa é a razão pela qual o arquivo fica tão fragmentado (um arquivo de 10GiB pode criar mais de cem mil fragmentos).

Eu não conheço nenhuma ferramenta / comando capaz de evitar isso quando a compactação NTFS está habilitada. Eu usei uma ferramenta há muito tempo que tinha uma boa GUI para copiar sem causar fragmentação no Windows, mas não consigo lembrar o nome.

Portanto, o melhor que posso dizer é usar no windows o utilitário de linha de comando XCOPY com o /J flag.

Ele tenta não fragmentar, ideal para arquivos grandes se a compactação NTFS estiver desativada ou se você estiver usando o FAT32.

Explicação da fragmentação do pipeline de compactação NTFS:

  1. O bloco N será escrito no Cluster N
  2. Clusters espalhados N + # serão compactados e armazenados em algum outro lugar, então os clusters entre N e N + # serão livres, também conhecidos como arquivos, serão fragmentados, muito fragmentados. 10GiB = 100000 fragmentos, assumindo uma compressão de 50%, é por isso que a compactação NTFS é muito ruim. Se o arquivo for compactado primeiro na RAM e depois enviado para o disco, nenhuma fragmentação ocorrerá ou, pelo menos, poderá ser evitada.

Outro efeito colateral desta maneira de fazer as coisas é assumir que temos 5Gib de espaço livre e eu quero escrever um arquivo de 6GiB que após a compactação levará apenas 3GiB. Isso não é possível, mas se você primeiro mover um 2GiB (não compressível) para outro local, o espaço livre será 7GiB, 6GiB, a compactação fará com que seja apenas 3GiB, o espaço livre será 4GiB, e depois o 2GiB do original os dados que nós movemos e voila tudo está lá e 2GiB livre. Aponte-se que, se não houver espaço suficiente para o arquivo descompactado, não será possível ser copiado em NTFS e não importa se, após a compactação NTFS, existir espaço suficiente. Precisa de tudo porque primeiro escreve sem compressão, então aplica a compressão. Por último, os drivers NTFS fazem isso no pipeline, portanto, em teoria, ainda seria possível, mas eles não alteraram a parte do tamanho livre de verificação.

O Windows não grava o arquivo "após" compactando, o Windows "compacta" o arquivo "após" salvando-o, então para cada cluster o disco verá duas tentativas de gravação, primeiro com dados não compactados, segundo com compactado dados. Os controladores NTFS de pipeline modernos evitam que o HDD veja as duas gravações, mas na primeira versão do NTFS, o HDD grava todo o arquivo descompactado e, em seguida, compacta o arquivo. Era muito perceptível com arquivos muito grandes e bem compactáveis. Escrever um arquivo de 10GiB que o NTFS compactou em apenas alguns MiB (um arquivo cheio de zeros) demorou mais para gravar do que gravar a versão não compactada do arquivo. Hoje em dia o pipeline quebrou isso, e agora demorou muito pouco tempo, mas o tamanho livre anterior ainda está lá.

Espero que um dia o método de compactação NTFS faça isso em uma linha, para que possamos obter arquivos compactados NTFS não fragmentados sem a necessidade de fragmentá-los depois de escrevê-los. Até lá, a melhor opção é XCOPY com o /J flag e CONTIG ou aquela ferramenta gráfica que não consigo lembrar o nome. Foi enquanto o Windows estava apenas no XP, e tinha opções para fazer uma pausa, para copiar em paralelo de HDD1 para HDD2 e HDD3 para HDD4, e é claro que o desejado, para pré-alocar. Espero que isso ajude!

    
por 15.11.2016 / 15:15