python - 在写入磁盘之前是否有任何理由将 ftp 下载保存到内存中?

标签 python ftp hard-drive latency

我正在用 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/

相关文章:

c# - 如何使用C#获取硬盘序列号?

c# - 使用硬盘驱动器扩展巨大的阵列

python - 从图像中提取 N 个补丁

java - 使用 Java 对 FTP 文件进行校验和

c - ftp 客户端/服务器管道损坏错误 C

ios - 如何使用FTP直接从iOS将图像上传到服务器目录

c# - 如何检测任何特定驱动器是否为硬盘驱动器?

python - 查找多个文件之间特定列中的共同元素

python - 我可以从 Python 中的线程导入模块吗?

python - Matplotlib:使 x 轴更长