Pelo que entendi, "arquivo esparso" significa que o arquivo pode ter 'lacunas'; portanto, os dados reais usados podem ser menores que o tamanho do arquivo lógico.
Como os sistemas de arquivos Linux salvam arquivos no disco? Estou interessado principalmente em ext4. Mas:
- Um arquivo pode ser salvo não sequencialmente no disco? Com isso, quero dizer que parte do arquivo está localizada no endereço físico X e a próxima parte no endereço físico Y, que não é próximo ao deslocamento X +).
- Posso, de alguma forma, controlar a seqüencialidade do arquivo?
Eu quero alocar um arquivo de 10GB. Quero que seja seqüencial no disco e não dividido entre diferentes compensações. - Ele age de maneira diferente entre os diferentes tipos?
linux
filesystems
hard-disk
io
hudac
fonte
fonte
dmsetup
programa, uma interface para o mapeador de dispositivos. Essa pode ser uma boa opção se você estiver planejando um armazenamento semelhante ao banco de dados.iso9660
eromfs
são incapazes de fazer isso e exigem armazenamento contínuo (dentre esses eu posso listar de cabeça para baixo).Respostas:
Sim; isso é conhecido como fragmentação de arquivo e não é incomum, especialmente em arquivos maiores. A maioria dos sistemas de arquivos aloca espaço conforme necessário, mais ou menos sequencialmente, mas não consegue adivinhar o comportamento futuro - por isso, se você escrever 200MiB em um arquivo e adicionar mais 100MiB, haverá uma chance diferente de zero de que ambos os conjuntos de dados serão ser armazenado em diferentes áreas do disco (basicamente, qualquer outra gravação que precise de mais espaço no disco, ocorrendo após a primeira gravação e antes da segunda, pode ocorrer entre as duas). Se um sistema de arquivos estiver quase cheio, a situação geralmente será pior: pode não haver uma área contígua de espaço livre grande o suficiente para armazenar um novo arquivo, portanto, ele deverá ser fragmentado.
Você pode informar ao sistema de arquivos o tamanho alvo do seu arquivo quando ele for criado; isso ajudará o sistema de arquivos a armazená-lo de maneira ideal. Muitos sistemas de arquivos modernos usam uma técnica conhecida como alocação atrasada, em que o layout em disco de um novo arquivo é calculado o mais tarde possível, para maximizar as informações disponíveis quando o cálculo é realizado. Você pode ajudar nesse processo usando a
posix_fallocate(3)
função para informar ao sistema de arquivos quanto espaço em disco deve ser alocado no total. Os sistemas de arquivos modernos tentarão executar essa alocação sequencialmente.Sistemas de arquivos diferentes se comportam de maneira diferente, sim. Os sistemas de arquivos baseados em log, como o NILFS2, não alocam armazenamento da mesma maneira que os sistemas de arquivos baseados em extensão, como o Ext4, e esse é apenas um exemplo de variação.
fonte
fallocate(3)
garantirá a seqüencialidade do arquivo? ou apenas indicará o sistema de arquivos? Não consigo entender completamente a partir das páginas de manual.O comando
filefrag
informará como seu arquivo está fisicamente armazenado no seu dispositivo:Se você escrever seu arquivo de uma só vez, acho que seu arquivo não será fragmentado.
A página de manual de
fallocate
(1) é bastante clara:É sequencial? O sistema primeiro tentará alocar os blocos sequencialmente. Se não puder, não o avisará.
fonte
ext4
.filefrag
está oculto/usr/sbin
. Mas parece funcionar para usuários comuns (no ext4, pelo menos). Pode ser instrutivo para ostrace
seu funcionamento ver como medir a fragmentação por si mesmo, se a falta de aviso for um obstáculo para você.Você menciona arquivos esparsos e nenhuma das outras respostas os mencionou.
A maioria dos arquivos não é esparsa. A maneira mais comum de criar um arquivo é escrever tudo de uma só vez, do início ao fim. Não há buracos lá.
No entanto, você pode dizer "vá para a posição 1.000.000.000.000 e escreva um byte lá". Isso criará um arquivo que parece ter um tamanho grande de etabyte, mas na verdade só usa (provavelmente) 4k no disco. Este é um arquivo esparso.
Você pode fazer isso várias vezes para o mesmo arquivo, deixando pequenas quantidades de dados espalhadas pelo vasto vazio.
Embora isso possa ser útil, existem duas desvantagens.
A primeira é que o arquivo será fragmentado, e é com isso que você se preocupa.
A segunda é que nem todos os programas lidam bem com esses arquivos. Por exemplo, alguns softwares de backup tentarão fazer backup do vazio e, assim, criarão um backup muito maior que o necessário, possivelmente grande demais para a mídia de backup.
fonte
Existem pelo menos algumas maneiras de conseguir isso.
Use um sistema de arquivos com muito espaço livre e pré-aloque o espaço (por exemplo, use um marcador de fim de dados específico do aplicativo e acrescente dados aleatórios até que o tamanho do arquivo atinja 10 GB). Não é garantido que isso resulte em dados não fragmentados.
Use um sistema de arquivos bruto (não cozido) em vez do ext4 etc. Os DBMSs às vezes fazem isso por razões de desempenho. A desvantagem é que você deve fazer seu próprio cache / diário / recuperação, etc., se necessário.
Instâncias em que você ganha muito com isso são relativamente raras - eu procuraria em outro lugar para otimizar o desempenho.
Veja também
É verdade que os sistemas de gerenciamento de banco de dados geralmente ignoram os sistemas de arquivos?
fonte
Se isso é uma coisa única e não é importante como o arquivo é armazenado originalmente, apenas o resultado importa, então você pode salvar o arquivo normalmente e executar o desfragmentador do seu sistema operacional. Em seguida, você pode verificar com esta resposta se o seu arquivo está inteiro, se não, repita. Essa é a maneira mais fácil de fazer isso, sem usar comandos ou programas externos, mas certamente não é o método mais rápido, porque desfragmenta todo o disco.
fonte
aptitude search ~ddefrag
foramddrescueview
e anids
biblioteca de remontagem do segmento TCP. Sua resposta não será muito útil se você não disser como o programa é chamado ou quais argumentos precisam ser passados.