我正在通过 FTP 下载一个大文件,以便在本地系统上处理该文件。处理该文件的程序一次性逐行读取该文件,从原始文件创建两个新文件。
是否可以在文件完全下载之前开始处理文件?这样做可能存在哪些问题?
笔记:我并不担心程序在下载完成之前到达文件末尾——文件下载的速度比程序处理数据的速度要快。
答案1
如果程序从头开始顺序读取数据,那么这是可能的。(某些程序,例如unzip
,首先尝试查找到文件末尾。)
答案2
假设文件未压缩,您可以在 Linux 上尝试以下操作:
wget -O - www.fileserver.com/file.ext | tee outputfile.out | ./someprogram
-O -
将导致wget
输出文件到,stdout
然后通过管道传输到,someprogram
同时tee
将输出的副本保存wget
到outputfile
。
答案3
是否有可能在文件完全下载之前开始处理它?
是的
这其中存在哪些潜在问题?
当到达 EOF 时 - 如何确定它是否真的是 EOF 或者读取器是否比接收器更快并且它应该等待一秒钟再重试读取?
解决办法如下:
使用超时 - 如果文件大小在几分钟内不再变化,则传输可能被视为完成。我不喜欢这个解决方案,因为没有人知道传输是否正常终止或连接是否丢失。
尝试预先获取文件大小 - 如果使用 ftp 服务器,通常可以在下载前执行“dir”命令来获取文件大小。此值可以传递给读取器程序
使下载脚本创建一个“传输完成”文件,当读取器程序遇到 EOF 时可以检查该文件。
注意:我并不担心程序在下载完成之前到达文件末尾——文件下载的速度比程序处理数据的速度要快。
你应该这样做 - 真的!如果网络连接速度比平时慢,只是因为正在进行其他传输怎么办?在这种情况下丢失数据可以吗?
答案4
这可能是流水线的一个很好的候选者。使用写入标准输出的 FTP 客户端让分割程序从标准输入读取。