Por que copiar a mesma quantidade de dados demora mais se espalhado por muitos arquivos separados?
12
Percebi que a cópia de dados de 24Mb de uma pasta para outra demorou cerca de 30 segundos porque (presumo que esse seja o motivo), havia mais de 1.000 arquivos separados. Copiar 24Mb não deve demorar muito. Por que o número de arquivos é diferente?
Estou executando o Windows 7 em um MacBook (4 GB de RAM, CPU Intel P7450 a 2.13 GHz, sistema operacional de 32 bits)
EDIT: NTFS é o sistema de arquivos usado na unidade
O disco rígido não possui uma taxa de transferência exata, depende de manutenção adequada, ou seja, não é fragmentado, não possui setores defeituosos, etc.
Se o HDD é SATA 2 e é a mesma partição, é apenas a velocidade da transferência de dados.
Se houver duas partições no mesmo HDD, não é necessária essa transferência de dados entre o barramento e a placa-mãe, ou seja, ela é carregada no buffer. (depende do tamanho do buffer do disco rígido).
Porém, para cada arquivo copiado, o sistema deve manter seu índice na MFT (Tabela de arquivos mestre) do disco rígido, o que torna o processo de cópia mais lento se você copiar muitos arquivos. E se você tiver algum antivírus, ele verificará cada arquivo que é copiado. E se você tiver ativado a indexação de arquivos de pesquisa da Microsoft (ou qualquer outro serviço de indexação de arquivos), o resultado será pior.
Eu acho que deve haver muitas outras razões pelas quais a cópia de muitos arquivos é mais lenta, mas essas devem ser as principais.
Desativar o programa antivírus tornou o extrato 10x mais rápido. Depois disso, os arquivos foram verificados quanto a vírus.
fat_mike
30
Por que o número de arquivos é diferente?
Aparentemente, você está se concentrando apenas no aspecto "copiar os dados" de "copiar um arquivo". Um arquivo é mais do que apenas os dados; é uma entidade em um sistema de arquivos . Um arquivo tem um nome e atributos e permissões. Todas essas informações adicionais sobre o arquivo devem ser duplicadas junto com os dados quando o "arquivo é copiado". Há uma quantidade significativa de E / S de disco para executar essa sobrecarga do sistema de arquivos.
O procedimento para copiar um (1) arquivo em um sistema de arquivos genérico seria algo como:
Encontre o arquivo de origem no sistema de arquivos. (uma)
Leia do disco a entrada do diretório para o arquivo de origem.
Verifique as permissões de leitura.
Encontre o arquivo de destino no sistema de arquivos. b)
Verifique as permissões de gravação no diretório de destino.
Expanda o diretório, se necessário, para acomodar o novo arquivo. c)
Atualize o diretório no disco. c1)
Encontre blocos gratuitos, aloque-os e atualize a tabela novamente. d)
Leia os dados do arquivo e copie para o arquivo de destino (ou seja, copie o "arquivo").
Atualize a entrada de diretório para o novo arquivo com (tamanho e hora). e)
Atualize o tempo de acesso da entrada do diretório de origem. f)
(a) No mínimo, isso significa pesquisar no diretório atual. Ou o caminho pode começar na raiz do sistema de arquivos e vários níveis de diretórios precisam ser percorridos.
(b) No mínimo, isso significa pesquisar no diretório atual. Ou o caminho pode começar na raiz do sistema de arquivos e vários níveis de diretórios precisam ser percorridos. Se o arquivo de destino já existir, determine como a cópia deve prosseguir ou abortar. Se o arquivo de destino não existir, será necessário criar uma nova entrada de diretório, e talvez isso envolva a expansão do diretório (ou seja, a sobrecarga de alocação do bloco de arquivos (também conhecido como cluster) ).
(c) Se o diretório precisar ser expandido, aloque um novo bloco localizando um bloco livre, modifique a tabela de alocação com a nova alocação e, em seguida, grave o (s) bloco (s) no disco. Como a maioria dos sistemas de arquivos mantém várias cópias da tabela de alocação, isso significa várias gravações no disco. (c1) Quando o diretório de destino estiver localizado, leia o bloco de diretório do disco, modifique -o com a nova entrada de diretório do arquivo copiado e, em seguida, grave o bloco no disco.
(d) Para copiar o arquivo, aloque blocos localizando blocos livres, modifique a tabela de alocação com as novas alocações e, em seguida, grave o (s) bloco (s) no disco. Como a maioria dos sistemas de arquivos mantém várias cópias da tabela de alocação, isso significa várias gravações no disco. Para manter a integridade dos dados, o sistema de arquivos pode não tentar unir (atrasar e mesclar) operações de gravação em disco para diretórios e tabelas de alocação, mas executar as operações de gravação imediatamente, à medida que os novos arquivos são criados e os blocos são alocados.
(e) Uma vez que copiar os dados é complele, atualizar a nova entrada de diretório para o arquivo copiado com o comprimento de arquivo adequado e marcas de tempo, e em seguida, escreva o bloco de diretório para o disco.
(f) Atualize a entrada do diretório de origem com um novo registro de data e hora de "acesso" e, em seguida, grave o bloco do diretório no disco.
Então, em vez de apenas um arquivo, sua pergunta é perguntar se fazer todo esse material para mil arquivos pode aumentar o tempo necessário para copiar apenas a parte dos dados dos arquivos? Se você copiar apenas um arquivo de 24 MB, terá algo para comparar com o tempo de cópia de mil arquivos.
Ao fazer backup de um sistema de arquivos, a cópia dos arquivos individuais para outro sistema de arquivos em um disco ou partição raramente é empregada porque é um processo bastante lento, como você descobriu. Um método mais rápido é criar e gravar um único arquivo que contém as entradas do diretório de origem e o conteúdo do arquivo em um formato de arquivo especial; programas de backup e o comando * nix 'tar' podem gerar um arquivo desse tipo. (Observe que 'tar' apenas lida com arquivos compactados e não usa compactação como utilitários de arquivo + compactação.) O método mais rápido de backup é gravar em um dispositivo de bloco (em vez de um sistema de arquivos em um dispositivo), para que o sistema de arquivos de origem seja ignorado (tratado como mais dados) e uma cópia de imagem bloco a bloco do dispositivo de origem pode ser executada.
(lembre-se, querida internet, que analogias são falhas. Sinta-se à vontade para apontar como nos comentários.)
Premissas:
O agente de transferência de informações de ==um garoto, vamos chamá-lo de Sam, está transferindo ovos de uma cesta para outra.
O meio de transferência de informações do ==ar, eu acho. Não é realmente importante aqui.
Os ovos provêm de várias espécies, incluindo ... dinossauros ... e míticos animais marinhos e dragões subaquáticos. (os ovos podem ser muito grandes)
Volume de ovo em tamanho de arquivo ==. Pense no ovo de robbin vs. ovo de draggon.
Analogia:
Então, Sam tem que mover os ovos de uma cesta para a outra, porque ele trabalha em uma fazenda e quem quer que lhe dê tarefas é mau. Existem vários animais que põem ovos nesta fazenda, incluindo dragões e bestas marinhas míticas; Sam acha isso incrível por vários motivos. (não é realmente importante, mas essa é a minha analogia)
Sam está relaxando no rio com suas duas cestas, uma das cestas é a que tem ovos dentro dela. Os ovos no cesto variam em tamanho de
ovo de um robbin ocupando 100 bytesespaço no cesto
para
Ovos Kraken, de tamanho redondinho 2.7Gb.
Sam tem que começar a mover os ovos, então ele só começa a pegar os ovos e movê-los. Digamos que ele decida primeiro mover um ovo de dragão. Agora, o ovo é extremamente maciço e denso, por isso leva um tempo para puxar a coisa para a outra cesta.
Sam coloca o ovo do dragão na outra cesta e ele está chateado. Isso foi difícil porque a coisa ocupava muito espaço; a mudança demorou muito para apenas um único ovo.
Sam é um tolo.
Sam volta para sua primeira cesta para pegar outro ovo. Ele percebe que realmente tinha apenas um grande problema. No entanto, restam 100.000.000.000 de ovos de robbin.
Como você pode ver, a tarde de Sam está arruinada. Sua inclinação natural seria que o dino-ovo fosse muito pior para ele ter que se mover. Isso faz sentido quando falamos de ovos e cestas, mas os computadores lidam com números como 100.000.000.000.
Em resumo:
A resposta sobre por que demora muito mais para mover vários arquivos pequenos, em comparação com alguns grandes, tem a ver com o custo associado à ação de movê-los. Quanto mais arquivos pequenos você tiver, mais vezes a ação precisará ser executada. Outra maneira de analisar isso seria falar sobre a densidade da informação.
No NTFS, todos os dados do arquivo - nome do arquivo, data de criação, permissões de acesso e conteúdo - são armazenados como metadados na tabela mestre de arquivos. A tabela mestre de arquivos (MFT) contém metadados sobre cada arquivo, diretório e metarquivo em um volume NTFS. Inclui nomes de arquivos, locais, tamanho e permissões. Uma entrada de diretório consiste em um nome de arquivo e um "ID do arquivo", que é o número do registro que representa o arquivo na Tabela Mestre de Arquivos. O ID do arquivo também contém uma contagem de reutilização para detectar referências obsoletas.
Lazy Badger
Então, sua resposta para a pergunta é baseada no fato de que ele precisa fazer muito trabalho extra criando registros para o nome do arquivo, local, tamanho, permissões, etc.? É daí que vem todo o trabalho extra.
Aparentemente, você está se concentrando apenas no aspecto "copiar os dados" de "copiar um arquivo". Um arquivo é mais do que apenas os dados; é uma entidade em um sistema de arquivos . Um arquivo tem um nome e atributos e permissões. Todas essas informações adicionais sobre o arquivo devem ser duplicadas junto com os dados quando o "arquivo é copiado". Há uma quantidade significativa de E / S de disco para executar essa sobrecarga do sistema de arquivos.
O procedimento para copiar um (1) arquivo em um sistema de arquivos genérico seria algo como:
(a) No mínimo, isso significa pesquisar no diretório atual. Ou o caminho pode começar na raiz do sistema de arquivos e vários níveis de diretórios precisam ser percorridos.
(b) No mínimo, isso significa pesquisar no diretório atual. Ou o caminho pode começar na raiz do sistema de arquivos e vários níveis de diretórios precisam ser percorridos. Se o arquivo de destino já existir, determine como a cópia deve prosseguir ou abortar. Se o arquivo de destino não existir, será necessário criar uma nova entrada de diretório, e talvez isso envolva a expansão do diretório (ou seja, a sobrecarga de alocação do bloco de arquivos (também conhecido como cluster) ).
(c) Se o diretório precisar ser expandido, aloque um novo bloco localizando um bloco livre, modifique a tabela de alocação com a nova alocação e, em seguida, grave o (s) bloco (s) no disco. Como a maioria dos sistemas de arquivos mantém várias cópias da tabela de alocação, isso significa várias gravações no disco.
(c1) Quando o diretório de destino estiver localizado, leia o bloco de diretório do disco, modifique -o com a nova entrada de diretório do arquivo copiado e, em seguida, grave o bloco no disco.
(d) Para copiar o arquivo, aloque blocos localizando blocos livres, modifique a tabela de alocação com as novas alocações e, em seguida, grave o (s) bloco (s) no disco. Como a maioria dos sistemas de arquivos mantém várias cópias da tabela de alocação, isso significa várias gravações no disco. Para manter a integridade dos dados, o sistema de arquivos pode não tentar unir (atrasar e mesclar) operações de gravação em disco para diretórios e tabelas de alocação, mas executar as operações de gravação imediatamente, à medida que os novos arquivos são criados e os blocos são alocados.
(e) Uma vez que copiar os dados é complele, atualizar a nova entrada de diretório para o arquivo copiado com o comprimento de arquivo adequado e marcas de tempo, e em seguida, escreva o bloco de diretório para o disco.
(f) Atualize a entrada do diretório de origem com um novo registro de data e hora de "acesso" e, em seguida, grave o bloco do diretório no disco.
Então, em vez de apenas um arquivo, sua pergunta é perguntar se fazer todo esse material para mil arquivos pode aumentar o tempo necessário para copiar apenas a parte dos dados dos arquivos? Se você copiar apenas um arquivo de 24 MB, terá algo para comparar com o tempo de cópia de mil arquivos.
Ao fazer backup de um sistema de arquivos, a cópia dos arquivos individuais para outro sistema de arquivos em um disco ou partição raramente é empregada porque é um processo bastante lento, como você descobriu. Um método mais rápido é criar e gravar um único arquivo que contém as entradas do diretório de origem e o conteúdo do arquivo em um formato de arquivo especial; programas de backup e o comando * nix 'tar' podem gerar um arquivo desse tipo. (Observe que 'tar' apenas lida com arquivos compactados e não usa compactação como utilitários de arquivo + compactação.) O método mais rápido de backup é gravar em um dispositivo de bloco (em vez de um sistema de arquivos em um dispositivo), para que o sistema de arquivos de origem seja ignorado (tratado como mais dados) e uma cópia de imagem bloco a bloco do dispositivo de origem pode ser executada.
fonte
Aqui está uma analogia conceitual:
(lembre-se, querida internet, que analogias são falhas. Sinta-se à vontade para apontar como nos comentários.)
Premissas:
==
um garoto, vamos chamá-lo de Sam, está transferindo ovos de uma cesta para outra.==
ar, eu acho. Não é realmente importante aqui.==
. Pense no ovo de robbin vs. ovo de draggon.Analogia:
Então, Sam tem que mover os ovos de uma cesta para a outra, porque ele trabalha em uma fazenda e quem quer que lhe dê tarefas é mau. Existem vários animais que põem ovos nesta fazenda, incluindo dragões e bestas marinhas míticas; Sam acha isso incrível por vários motivos. (não é realmente importante, mas essa é a minha analogia)
Sam está relaxando no rio com suas duas cestas, uma das cestas é a que tem ovos dentro dela. Os ovos no cesto variam em tamanho de
100 bytes
espaço no cestopara
2.7Gb
.Sam tem que começar a mover os ovos, então ele só começa a pegar os ovos e movê-los. Digamos que ele decida primeiro mover um ovo de dragão. Agora, o ovo é extremamente maciço e denso, por isso leva um tempo para puxar a coisa para a outra cesta.
Sam coloca o ovo do dragão na outra cesta e ele está chateado. Isso foi difícil porque a coisa ocupava muito espaço; a mudança demorou muito para apenas um único ovo.
Sam é um tolo.
Sam volta para sua primeira cesta para pegar outro ovo. Ele percebe que realmente tinha apenas um grande problema. No entanto, restam 100.000.000.000 de ovos de robbin.
Como você pode ver, a tarde de Sam está arruinada. Sua inclinação natural seria que o dino-ovo fosse muito pior para ele ter que se mover. Isso faz sentido quando falamos de ovos e cestas, mas os computadores lidam com números como 100.000.000.000.
Em resumo:
A resposta sobre por que demora muito mais para mover vários arquivos pequenos, em comparação com alguns grandes, tem a ver com o custo associado à ação de movê-los. Quanto mais arquivos pequenos você tiver, mais vezes a ação precisará ser executada. Outra maneira de analisar isso seria falar sobre a densidade da informação.
fonte
Leia o FAT, reposicione os cabeçotes, abra o arquivo na troca de arquivos - tudo isso exige tempo
fonte