Python - 在超出 RAM 的流中创建 Zip

问题描述 投票:0回答:1

我正在尝试在目录中动态创建一个 zip 文件,并通过 Flask 应用程序将其返回给用户。下面的内容非常适合较小的目录,但我也想通过充满图像的大型目录(> 20GB)来实现这一点。

def return_zip():
    dir_to_send = '/dir/to/the/files'
    base_path = pathlib.Path(dir_to_send)
    data = io.BytesIO()
    with zipfile.ZipFile(data, mode='w') as z:
        for f_name in base_path.iterdir():
            z.write(f_name, arcname=f_name.name)
    data.seek(0)
    return send_file(data, mimetype='application/zip', as_attachment=True, attachment_filename='data.zip')

在大型目录上尝试此操作时,整个系统崩溃,是否有任何方法可以在流中创建超出系统内存的 zip?

我不想将 ZIP 写入磁盘,然后将其发送给用户,然后从磁盘中删除它,因为这只会增加 R/W 操作,从而磨损所有内容所在的存储驱动器。

操作系统在 SSD 上运行(与要压缩的图像不是同一驱动器),也许其中一部分可以变成虚拟 RAM?我不太擅长记忆。

任何想法将不胜感激!

Ubuntu 20.04、带 Flask 的 Python3、2TB 存储驱动器和带有 8GB RAM 的 250GB 操作系统 SSD。

python flask zip python-zipfile stringio
1个回答
2
投票
遗憾的是,Python 本身完全无法传输 ZIP 数据。它将整个 ZIP 保留在内存中,直到完成生成 ZIP 文件...直到整个 ZIP 完全写入磁盘为止,它不会释放内存。

但是,

有两个现代的、维护的 Python 3 库,用于生成内存使用量较低的实时流 ZIP 数据。

最后,如果您也需要流式解压,那么同一作者的这个相关项目是最好的(写得很好,安全且符合 ZIP 标准):

  • https://github.com/uktrade/stream-unzip/tree/main
© www.soinside.com 2019 - 2024. All rights reserved.