É possível, se o programa ler dados sequencialmente a partir do início. (Alguns, como unzip
, tentam procurar primeiro o final do arquivo.)
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.
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
.
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?
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.
Tags unix filesystems