Mover um arquivo aberto para um dispositivo diferente

3

Eu tenho um aplicativo em execução que está gerando um arquivo de saída grande (~ 200 GB) e leva cerca de 35 horas para ser executado (atualmente estou com cerca de 12 horas). O aplicativo apenas abre o arquivo uma vez e o mantém aberto enquanto está sendo escrito até que esteja completo; o aplicativo também faz muitas gravações de acesso aleatório no arquivo (ou seja, não gravações sequenciais).

Neste momento, o arquivo está sendo salvo em meu disco rígido local, mas decidi que, quando terminar, vou movê-lo para um dispositivo diferente (uma unidade de rede, NTFS montada via SMB).

Para economizar tempo em vez de mover o arquivo mais tarde, existe alguma maneira de suspender o programa e de alguma forma mover o arquivo parcialmente completo para o outro dispositivo, fazer alguns truques e retomar o programa para que ele esteja usando agora o novo localização?

Estou bem certo de que a resposta é não, mas eu pensei em perguntar, às vezes há truques surpreendentes por aí ...

    
por Jason C 11.06.2014 / 00:11

3 respostas

4

Publicando outra solução, já que o arquivo está sendo escrito aleatoriamente, quebra minha ideia de tail . Pensar em rsync pode ser promissor aqui, pois o rsync pode operar usando um algoritmo de transferência delta, economizando tempo de transferência enviando apenas as partes alteradas de um arquivo. Se você executar rsync em dois arquivos locais, o padrão será --whole-file mode, que não é o que você deseja.

Sugerindo

rsync -av --inplace --no-whole-file /your/local/file.dat /your/remote/file.dat

... ou talvez (se a montagem CIFS não concordar com a transferência delta) use rsync :

puro
rsync -av --inplace --no-whole-file /your/local/file.dat remoteserver:/your/directory/file.dat

Assim, você executaria isso várias vezes enquanto seu arquivo de 200 GB estiver sendo preenchido. Cada vez que você o executa, ele atualiza o arquivo remoto de forma incremental. Isso deve funcionar mesmo quando o arquivo de origem estiver sendo atualizado aleatoriamente. Talvez você possa rodar isso a cada 15 minutos. Então, quando seu pid terminar, você o executaria mais uma vez, e seria apenas um delta incremental rápido.

    
por 11.06.2014 / 21:01
2

Supondo que a unidade de rede esteja montada (NFS ou qualquer outro),

tail -f -c1000000000000 /your/local/file.dat > /mnt/nfs/drive/file.dat

Isso iniciará a cópia do arquivo de saída na unidade de rede e a manterá sincronizada. Quando o seu programa terminar, você deverá ver o mesmo arquivo de 200GB no fs local e na rede. Talvez faça um md5sum em ambos para verificar.

Alguns tipos de unix também podem suportar a execução de tail com --pid={Your pid here} , o que irá parar automaticamente quando o seu pid terminar.

    
por 11.06.2014 / 03:26
1

Você pode tentar:

  1. Suspenda seu aplicativo strg+z
  2. Ir para o diretório em que o arquivo é gerado cd CURRENT_CREATION_DIR
  3. Mover o arquivo gerado para o novo local mv FILE /path/to/new/location/
  4. Crie um link simbólico para o arquivo no novo local ln -s /path/to/new/location/FILE
  5. Continue sua inscrição fg [ENTER]

CUIDADO:
Talvez você deva iniciar uma segunda instância do seu programa, gerando um arquivo de teste e testando as etapas acima no arquivo de teste primeiro. Eu não sei se o seu aplicativo está bem com um link simbólico e apenas continua. É possível que o programa falhe.

    
por 11.06.2014 / 09:20