【问题标题】:Is there any reason to save ftp downloads to memory before writing to disk?在写入磁盘之前是否有任何理由将 ftp 下载保存到内存中?
【发布时间】:2014-02-07 19:16:56
【问题描述】:

我正在用 Python 为我公司的一些组织代码编写自定义 ftp 管理器。 我只是扩展了基本的 retrbinary 给用户一些反馈,下载百分比,时间流逝,诸如此类。我突然想到,我可以将下载的块保存到内存中,而不是在收到它们后立即写入它们,然后在完成时写入整个二进制文件。或者,我可以将小块大小保存到内存中,并设置更大的截止大小来进行磁盘写入,以块的形式写入磁盘,但块大于通过网络传入的块。

我可以做这些事情。我还不知道是否有任何令人信服的理由去做这些事情。它可能会增加可靠性还是什么?

谢谢!

【问题讨论】:

    标签: python ftp hard-drive latency


    【解决方案1】:
    • 如果您将整个文件保存在内存中,那么您将占用一些资源。如果文件非常大,或者如果您同时下载多个加起来“非常大”的文件,您甚至可能会因为内存不足而失败(在 32 位系统上比在 64 位系统上更有可能)。然后你会希望你已经保存了,特别是如果下载需要很长时间并且必须从头开始。

    • 如果您保存了部分文件并且操作失败,那么您可以稍后从失败的地方恢复 (https://stackoverflow.com/questions/5678119/how-does-a-ftp-server-resume-a-download)

    • 如果您保存文件的一部分并且想要完全失败而不期望恢复,您可能必须编写(少量)额外代码来删除损坏的部分文件。

    • 如果您要随时保存,那么等待一次将多个块写入磁盘并没有太大的好处。通常您的网络 I/O 会比磁盘 I/O 慢得多,但如果不是这种情况,那么可能执行更少、更大的磁盘写入会更有效。即使你关心这一点,你也可以通过设置你正在写入的文件的缓冲区大小来做到这一点(例如,使用buffering 参数到open())。无需编写自己的代码来保留一定数量的数据。

    我认为平衡通常是在获得数据后或多或少地将数据写入磁盘。可能会有不同的特殊情况。

    如果不是因为您随时显示进度,那么如果您通过单个 read() 调用将整个文件下载到内存中,代码可能会更简单(不确定是否有简单的方法尤其是ftplib,但可以使用其他下载机制)。由于您无论如何都是以小块的形式下载文件,我怀疑它是否会使您编写的代码显着复杂化,但如果它以某种方式这样做,那么这也可能值得考虑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      • 1970-01-01
      • 2019-07-22
      • 1970-01-01
      • 1970-01-01
      • 2013-10-05
      • 2010-11-29
      相关资源
      最近更新 更多