Leia um arquivo que está sendo escrito ativamente

3

Estou baixando um arquivo grande via FTP para que eu possa processar o arquivo no meu sistema local. O programa que processa o arquivo lê o arquivo linha por linha em uma única passagem, criando dois novos arquivos a partir do original.

Seria possível começar a processar o arquivo antes que ele seja completamente baixado? Quais são os possíveis problemas com isso?

Nota : Eu não estou realmente preocupado com o programa chegar ao final do arquivo antes de terminar o download - o arquivo está sendo baixado mais rapidamente do que o programa pode processar os dados.

    
por Daniel Standage 14.09.2011 / 20:11

4 respostas

5

É possível, se o programa ler dados sequencialmente a partir do início. (Alguns, como unzip , tentam procurar primeiro o final do arquivo.)

    
por 14.09.2011 / 20:20
5

Supondo que o arquivo não está compactado, você pode tentar o seguinte no Linux:

wget -O - www.fileserver.com/file.ext | tee outputfile.out | ./someprogram

-O - fará com que wget envie o arquivo para stdout , que será canalizado para someprogram , enquanto tee salvará uma cópia da wget para outputfile .

    
por 14.09.2011 / 20:43
2

Would it be possible to start processing the file before it is completely downloaded?

sim

What are the potential issues with this?

Ao alcançar o EOF - como determinar se é realmente EOF ou se o leitor era apenas mais rápido que o receptor e deve esperar um segundo antes de repetir a leitura?

Soluções para isso seriam:

  • usar tempos limite - se o tamanho do arquivo não mudar mais por alguns minutos, a transferência pode ser considerada completa. Eu não gosto dessa solução, pois nunca se sabe se a transferência foi finalizada ok ou se a conexão foi perdida.

  • tente obter o tamanho do arquivo antecipadamente - se estiver usando um servidor FTP, pode-se geralmente executar um comando 'dir' para obter o tamanho do arquivo antes de fazer o download. Este valor pode ser passado para o programa de leitura

  • faça o script de download para criar um arquivo de 'transferência completa' que o programa de leitura possa verificar quando encontrar EOF.

Note: I'm not really worried about the program reaching the end of the file before it's done downloading--the file is being downloaded more quickly than the program can process the data.

Você deveria - realmente! E se a conexão de rede for mais lenta que o normal só por causa de algumas outras transferências acontecendo? Estaria ok perder dados neste caso?

    
por 15.09.2011 / 15:30
1

Isso pode ser um bom candidato para pipelining. Use um cliente FTP que grava na saída padrão e leia o programa de divisão da entrada padrão.

    
por 14.09.2011 / 20:39