读取正在写入的文件

读取正在写入的文件

我正在通过 FTP 下载一个大文件,以便在本地系统上处理该文件。处理该文件的程序一次性逐行读取该文件,从原始文件创建两个新文件。

是否可以在文件完全下载之前开始处理文件?这样做可能存在哪些问题?

笔记:我并不担心程序在下载完成之前到达文件末尾——文件下载的速度比程序处理数据的速度要快。

答案1

如果程序从头开始顺序读取数据,那么这是可能的。(某些程序,例如unzip,首先尝试查找到文件末尾。)

答案2

假设文件未压缩,您可以在 Linux 上尝试以下操作:

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

-O -将导致wget输出文件到,stdout然后通过管道传输到,someprogram 同时tee将输出的副本保存wgetoutputfile

答案3

是否有可能在文件完全下载之前开始处理它?

是的

这其中存在哪些潜在问题?

当到达 EOF 时 - 如何确定它是否真的是 EOF 或者读取器是否比接收器更快并且它应该等待一秒钟再重试读取?

解决办法如下:

  • 使用超时 - 如果文件大小在几分钟内不再变化,则传输可能被视为完成。我不喜欢这个解决方案,因为没有人知道传输是否正常终止或连接是否丢失。

  • 尝试预先获取文件大小 - 如果使用 ftp 服务器,通常可以在下载前执行“dir”命令来获取文件大小。此值可以传递给读取器程序

  • 使下载脚本创建一个“传输完成”文件,当读取器程序遇到 EOF 时可以检查该文件。

注意:我并不担心程序在下载完成之前到达文件末尾——文件下载的速度比程序处理数据的速度要快。

你应该这样做 - 真的!如果网络连接速度比平时慢,只是因为正在进行其他传输怎么办?在这种情况下丢失数据可以吗?

答案4

这可能是流水线的一个很好的候选者。使用写入标准输出的 FTP 客户端让分割程序从标准输入读取。

相关内容