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