我正在用Python编写一个自定义ftp管理器,用于我公司的一些组织代码。 我只是扩展了基本的retrbinary,以便为用户提供一些反馈,下载百分比,已过去的时间等等。在我看来,我可以将下载的块保存到内存中,而不是在收到它们后立即写入它们,然后在完成时写入整个二进制文件。或者,我可以将小块大小保存到内存中,并设置更大的截止大小来进行磁盘写入,以块的形式写入磁盘,但是块大于通过线路传入的块。
我可以做这些事。我还不知道是否有任何令人信服的理由去做这些事情。它可能会增加可靠性还是什么?
谢谢!
答案 0 :(得分:2)
如果您将整个文件保留在内存中,那么您将占用一些资源。如果文件非常大,或者你同时下载了几个加起来“非常大”的文件,你甚至可能会因内存不足而失败(更可能是32位系统而不是64位)。然后你会希望你已经保存了,特别是如果下载需要很长时间并且必须从头开始。
如果您保存部分文件并且操作失败,那么您可以稍后从失败的地方恢复(https://stackoverflow.com/questions/5678119/how-does-a-ftp-server-resume-a-download)
如果保存文件的一部分并且想要完全失败而不期望恢复,则可能需要编写(少量)额外代码来删除损坏的部分文件。
如果您要保存,那么等待一次将多个块写入磁盘没有多大好处。通常,您的网络I / O将比磁盘I / O慢得多,但如果不是这种情况,则可能更有效地执行更少,更大的磁盘写入。即使您关心这一点,也可以通过设置要写入的文件的缓冲区大小来实现(例如使用buffering
参数open()
)。没有必要编写自己的代码来保持一定数量的数据。
我认为平衡通常是在您拥有数据后或多或少地将数据写入磁盘。可能会有不同的特殊情况。
如果不是因为你正在显示进度,那么如果你通过一次read()
调用将整个文件下载到内存中,代码可能会更简单(不确定是否存在特别是使用ftplib
的简单方法,但可以使用其他下载机制。既然你无论如何都要以小块的形式下载文件,我怀疑这会使你要编写的代码变得非常复杂,但如果它以某种方式确实存在,那么这也值得考虑。