Como copio rapidamente 900.000 arquivos?

9

Preciso copiar alguns dados que incluem 900.000 arquivos minúsculos, totalizando cerca de 30 gigabytes, em um computador com Windows. No entanto, ele precisa ser copiado e configurado em menos de uma hora e meia e pode levar mais de 5 horas para copiar um disco rígido USB, principalmente devido à quantidade louca de arquivos. Existe uma maneira melhor / mais rápida de lidar com isso, como fazer algum tipo de cópia em bloco? obrigado

Joe Lyga
fonte
8
Esse será um alvo muito agressivo para qualquer cópia baseada em arquivo de um único disco não SSD. Apenas enumerar todos os arquivos e lidar com as entradas e metadados do sistema de arquivos para muitos arquivos leva um tempo significativo.
afrazier
5
Você é capaz de remover o disco rígido e colocá-lo no destino? essa seria a velocidade mais rápida, transferida pelo backplane da placa-mãe.
Itom
11
xkcd.com/949
user541686
Deseja ver esta pergunta no blog? Ajuda respondendo ou votando no Meta .
Tamara Wijsman

Respostas:

7

Com um grande número de arquivos, é melhor criar um arquivo tar para que você tenha menos arquivos para lidar. Se você estiver usando o disco rígido externo USB 2.0, deverá usar o USB 3.0, eSATA ou uma rede local rápida.

Qual é o seu SO de origem? Se os dois sistemas operacionais fossem Linux, você poderia canalizar os arquivos através de tar, gzip e ssh para a máquina de destino. Você pode instalar o cygwin no Windows para obter esse tipo de funcionalidade para o Windows também.

Atualização: A postagem
" Usando Tar e SSH para melhorar as velocidades do SCP " descreve os comandos necessários para enviar o conteúdo do tar pelo ssh.

dabest1
fonte
O tar ainda lerá todos os arquivos um por um.
Tomas Andrle
Sim, mas você faria isso apenas uma vez e outros comandos como o scp não seriam atrasados ​​ao lidar com arquivos individuais. Se os arquivos puderem ser mantidos no arquivo tar na máquina de destino, você também estará economizando tempo escrevendo um arquivo em vez de muitos.
dabest1
Presumo que a conexão USB seja o gargalo. Portanto, tirar uma imagem bruta da unidade, como sugere @arcyqwerty, parece a melhor solução para mim. Eu ficaria curioso para ver alguns resultados reais, talvez eu esteja completamente errado!
Tomas Andrle
11
@ TomA - Na minha experiência ao lidar com muitos arquivos pequenos, o disco rígido é o gargalo. Cada leitura de arquivo requer uma busca principal no bitmap de Alocação e outra busca direta no conteúdo real do arquivo. Como resultado, o disco rígido passa a maior parte do tempo procurando e muito pouco tempo lendo os arquivos.
Fake Name
2
Por exemplo, com arquivos de 1K, obtenho ~ 1-5 MBps na minha LAN de gigabit. Com arquivos grandes (gigabytes cada), recebo ~ 80-90 MBps. É tudo sobre as leituras seqüenciais.
Fake Name
8

Se o disco rígido puder ser removido da interface USB para o SATA / ATA, eu o instalaria no computador de destino. Você obterá velocidades de transferência muito mais rápidas, como outros observaram. Para copiar, supondo que você esteja no Windows, eu faria um simples ROBOCOPIA. É o mais rápido que você realmente pode esperar, embora existam outras alternativas.

ROBOCOPY /E /B /MT 'source' 'destination'

Eu tentaria evitar a compactação de todos esses arquivos, porém, há uma boa chance de o tempo para compactar e mover exceder a simples movimentação dos arquivos.

* Adicionada a opção / MT para robocopy. Pode acelerar bastante as transferências quando você estiver em um ambiente com vários threads.

Lee Harrison
fonte
Vai /MTajudar em transferências de disco individuais locais, ou causar surra disco maciça? É comum copiar grandes compartilhamentos entre servidores, mas eles geralmente adicionam latência devido à passagem pela rede e IOPS aprimorado de matrizes RAID.
afrazier
Eu realmente não posso comentar muito sobre esse aspecto. Uso robocopy para fazer backup de todos os meus projetos de VS todas as noites, embora valha apenas 10 GB. Leva apenas alguns instantes, pois os arquivos que já existem não são copiados. Encontrei esses benchmarks de Robocopy há alguns meses: demartek.com/Reports_Free/…
Lee Harrison
na minha experiência, se o adaptador USB para SATA no gabinete da unidade suportar filas de comandos nativas, recebo um aumento significativo no desempenho da opção / MT.
longneck
6

Você pode tentar tirar uma imagem de toda a pasta / unidade

Nos sistemas Linux, você pode usar ddpara obter uma cópia bruta do sistema de arquivos e copiá-la como um único arquivo grande.

Para extrair a imagem no Windows, pode ser necessário instalar o cygwin ou um programa capaz de processar ddimagens.

arcyqwerty
fonte
Esse é o bilhete.
Tomas Andrle
3

Instale o disco em que os arquivos de origem residem no computador que você está configurando e transfira o disco para o disco. Esqueça o USB. Mesmo a transferência pelo cabo (conecte as máquinas em rede) seria mais rápida que o USB (supondo USB 2.0 e 1Gbps NIC). Se este for um evento recorrente, verifique a replicação.

Paul Ackerman
fonte
3

Use rsynccom a zopção

-z,         --compress              compress file data during the transfer
            --compress-level=NUM    explicitly set compression level
            --skip-compress=LIST    skip compressing files with suffix in LIST

Isso aumentará a velocidade de transferência pela rede. Portanto, provavelmente não é útil no seu caso.

Após algumas leituras, percebi que, não devemos usar o sinalizador '-z' ao copiar dados de um disco rígido local para outro, pois isso aumenta a sobrecarga. Obrigado a comentar de @FakeName.

Sachin Divekar
fonte
11
O rsync não compacta para transferências locais (ou através de uma LAN, acredito). Além disso, isso não traria nenhum benefício, já que o problema real é o tempo necessário para a leitura dos arquivos, não para enviá-los pela conexão (como cada arquivo lido leva duas operações de busca, no mínimo).
Fake Name
@FakeName +1, você está certo, depois de algumas leituras, entendi seu ponto. Eu atualizei minha resposta.
Sachin Divekar
1

Você está se aproximando rapidamente das limitações do seu disco rígido. De fato, com as unidades de mercadorias atuais, é impossível reduzir o tempo de transferência com uma operação de cópia por arquivo.

Supondo que cada arquivo requer 1 HD de busca e tempo de busca é de 7 ms (o que é um pouco idealizado, realisticamente, cada arquivo exigirá duas buscas, a menos que o bitmap de volume esteja armazenado em cache no ram), na melhor das hipóteses, você gerenciará ~ 142 arquivos / s ( \ $ \ frac {1000} {7} = 142,8 ... \ $).

Com as especificações do OP (30 GB, 900.000 arquivos), é ~ 33K por arquivo (\ $ \ frac {30.000.000k} {900.000} = ~ 33,3 ... \ $. 33KB * 142 = 4,68 MBps.

O tempo mínimo para transferir 30 GB a 5 MBps é de ~ 1 hora e 40 minutos (\ $ \ frac {30.000} {5} = = 6.000 \ $ segundos. \ $ \ Frac {6.000} {60} = 100 \ $ minutos ou 1:40 horas)

Portanto, é impossível alcançar uma velocidade melhor que ~ 5 MBPS, e isso é com uma unidade ideal (e menos operações de busca. Isso é para uma busca por arquivo. Realmente, seriam duas). Você está limitado inteiramente pelo desempenho do disco.


A única maneira de melhorar o desempenho é copiando todo o sistema de arquivos e partindo sequencialmente. ddpode fazer isso no linux.

O que você está tentando fazer?

Nome falso
fonte
O TeX está trabalhando para mais alguém? Parece não estar renderizando para mim.
Fake Name
0

Experimente o 7zip para arquivar os arquivos em um único arquivo. Se possível, use a WLAN com uma conexão adhoc a um notebook.

ott--
fonte
11
ou melhor ainda, uma ligação directa Ethernet, de preferência giga-e
qualificado totó
0

Relacionado à resposta do @arcyqwery, você pode compactá-lo e transformá-lo simultaneamente em um arquivo grande. Isso irá acelerar o processo alguns.

Também pode valer a pena usar um programa como o TeraCopy , pois geralmente é mais rápido que o desempenho padrão de cópia do Windows. Você deve testar em circunstâncias semelhantes no seu caso para verificar.

soandos
fonte
0

Eu tive um caso semelhante. Desliguei o antivírus, a velocidade da cópia foi alterada de 3MB / s para 12MB / s.

insira a descrição da imagem aqui

Rm558
fonte