Seu problema provavelmente não está no seu computador, por si só, provavelmente está bom. Mas essa camada de transição flash USB possui um processador próprio que precisa mapear todas as suas gravações para compensar o que poderia ser tanto quanto um chip flash com falha de 90%, quem sabe? Você o inunda, depois inunda seus amortecedores, inunda todo o ônibus e fica preso, cara - afinal, é aí que estão todas as suas coisas. Pode parecer contra-intuitivo, mas o que você realmente precisa é bloquear a E / S - você precisa deixar o FTL definir o ritmo e, em seguida, apenas prosseguir.
(Sobre hackers de microcontroladores FTL: http://www.bunniestudios.com/blog/?p=3554 )
Todas as respostas acima devem funcionar, então isso é mais um "eu também!" do que qualquer outra coisa: eu estive totalmente lá, cara. Resolvi meus próprios problemas com o rsync --bwlimit arg (2,5mbs parecia ser o ponto ideal para uma única execução sem erros - qualquer coisa mais e eu acabaria com erros de proteção contra gravação). O rsync foi especialmente adequado ao meu objetivo, porque eu estava trabalhando com sistemas de arquivos inteiros - portanto, havia muitos arquivos - e simplesmente executar o rsync uma segunda vez corrigia todos os problemas da primeira execução (o que era necessário quando eu ficava impaciente e tentava ultrapassar 2,5mbs).
Ainda assim, acho que isso não é tão prático para um único arquivo. No seu caso, você pode simplesmente canalizar para dd definido como raw-write - você pode manipular qualquer entrada dessa maneira, mas apenas um arquivo de destino por vez (embora esse arquivo único possa ser um dispositivo de bloco inteiro, é claro).
## OBTAIN OPTIMAL IO VALUE FOR TARGET HOST DEV ##
## IT'S IMPORTANT THAT YOUR "bs" VALUE IS A MULTIPLE ##
## OF YOUR TARGET DEV'S SECTOR SIZE (USUALLY 512b) ##
% bs=$(blockdev --getoptio /local/target/dev)
## START LISTENING; PIPE OUT ON INPUT ##
% nc -l -p $PORT | lz4 |\
## PIPE THROUGH DECOMPRESSOR TO DD ##
> dd bs=$bs of=/mnt/local/target.file \
## AND BE SURE DD'S FLAGS DECLARE RAW IO ##
> conv=fsync oflag=direct,sync,nocache
## OUR RECEIVER'S WAITING; DIAL REMOTE TO BEGIN ##
% ssh user@remote.host <<-REMOTECMD
## JUST REVERSED; NO RAW IO FLAGS NEEDED HERE, THOUGH ##
> dd if=/remote/source.file bs=$bs |\
> lz4 -9 | nc local.target.domain $PORT
> REMOTECMD
Você pode achar que o netcat é um pouco mais rápido que o ssh para o transporte de dados, se você tentar. Enfim, as outras idéias já foram tomadas, então por que não?
[EDIT]: notei as menções de lftp, scp e ssh no outro post e pensei que estávamos falando sobre uma cópia remota. Local é muito mais fácil:
% bs=$(blockdev --getoptio /local/target/dev)
% dd if=/src/fi.le bs=$bs iflag=fullblock of=/tgt/fi.le \
> conv=fsync oflag=direct,sync,nocache
[EDIT2]: Crédito onde é devido: notei que o ptman me venceu por cinco horas nos comentários.
Definitivamente, você pode ajustar o $ bs para obter o desempenho aqui com um multiplicador - mas alguns sistemas de arquivos podem exigir que ele seja um múltiplo do setor de destino do FS, portanto, lembre-se disso.
ionice
pode ser usado para garantir que seu processo de cópia de disco para disco seja agendado de E / S com uma prioridade mais baixa que os processos regulares.