Existem duas opções para desfragmentação. Você pode fazer isso do jeito fácil, ou você pode fazer do jeito bom:
-
Mantenha os dados a serem movidos e desfragmentados inteiramente na memória. Essencialmente você tem que ler arquivos inteiros até liberar espaço suficiente para depois escrever um em um bloco contínuo.
- o lado positivo disso é que ele será mais rápido e não precisará de armazenamento extra no disco
-
Mova os dados para outro local no disco e, em seguida, mova-o de volta quando um bloco contínuo grande o suficiente for criado.
- desta forma é muito mais lento, pois os dados precisam ser repetidamente lidos e escritos em algum outro lugar.
A opção 1 não precisa de espaço extra no disco, mas também é potencialmente perigosa.
- Enquanto os arquivos estão sendo lidos e excluídos, os dados não existem mais no disco. No caso de um corte de energia, quaisquer arquivos que tenham sido lidos, mas não restaurados, serão perdidos, potencialmente com efeitos catastróficos.
- você não tem ideia do tamanho do buffer necessário para ler arquivos. Você pode ter vários arquivos gigabytes que precisam ser movidos ou muitos arquivos pequenos. Ele precisa da capacidade de alocar potencialmente infinitas quantidades de memória (expandindo o arquivo de paginação e tornando a fragmentação pior ) ou usar uma porcentagem fixa de memória. Se você tem um tamanho de buffer fixo você pode carregar (e truncar) parte do arquivo para liberar espaço, mas você acaba em uma posição pior em que você poderia ter perdido partes de arquivos no evento de falta de energia que seria indiscutivelmente pior do que falta de todo o arquivo.
A opção 2 sempre garante que seus dados estejam no disco, especialmente se você copiar primeiro e , em seguida, excluir os blocos.
Então, sim, para uma desfragmentação segura sem a ameaça iminente de perda de dados catastrófica, você precisa de um pouco de espaço livre em disco.