3

Я загружаю большой файл через FTP, чтобы я мог обработать файл в моей локальной системе. Программа, которая обрабатывает файл, читает файл построчно за один проход, создавая два новых файла из оригинала.

Можно ли начать обработку файла до его полной загрузки? Каковы потенциальные проблемы с этим?

Примечание: я не очень беспокоюсь о том, что программа доходит до конца файла до того, как она закончила загрузку - файл загружается быстрее, чем программа может обработать данные.

4 ответа4

5

Это возможно, если программа считывает данные последовательно от запуска. (Некоторые, такие как unzip , сначала пытаются найти конец файла.)

5

Предполагая, что файл не сжат, вы можете попробовать следующее в Linux:

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

-O - заставит wget вывести файл на стандартный stdout который затем будет передан someprogram то программе, в то время как tee сохранит копию вывода wget выходной outputfile .

2

Можно ли начать обработку файла до его полной загрузки?

да

Каковы потенциальные проблемы с этим?

При достижении EOF - как определить, действительно ли это EOF или считыватель был просто быстрее, чем приемник, и ему следует просто подождать секунду, прежде чем повторить чтение?

Решения для этого будут:

  • использовать таймауты - если размер файла больше не меняется в течение пары минут, передача может считаться завершенной. Мне не нравится это решение, так как никто никогда не узнает, была ли передача завершена нормально или соединение потеряно.

  • попробуйте заранее определить размер файла - если вы используете ftp-сервер, обычно можно выполнить команду 'dir', чтобы получить размер файла перед загрузкой. Это значение может быть передано программе чтения

  • Создайте сценарий загрузки, чтобы создать файл «Передача завершена», который программа-читатель может проверить при обнаружении EOF.

Примечание: я не очень беспокоюсь о том, что программа доходит до конца файла до того, как она закончила загрузку - файл загружается быстрее, чем программа может обработать данные.

Вы должны - действительно! Что делать, если сетевое соединение медленнее обычного только из-за других передач? Было бы нормально потерять данные в этом случае?

1

Это может быть хорошим кандидатом на конвейерную работу. Используйте клиент FTP, который выполняет запись в стандартный вывод, чтобы программа разбиения считывала данные из стандартного ввода.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .