如何在总大小 > 可用内存的 Python 中连接文件

How to concat files in Python where total size > available memory

我正在为 Resumable.js 编写 Python 后端,它允许通过在客户端将大文件拆分为较小的块来从浏览器上传大文件。

一旦服务器完成将所有块保存到一个临时文件夹中,就需要将它们组合起来。单个块是非常小的(默认为 1 MB)二进制文件,但它们的总大小可能大于 Web 服务器的可用内存。

在 Python 中,您将如何进行合并步骤?假设一个文件夹只包含 n 个文件,名称为:“1”、“2”、“3”...

你能解释一下吗:

在这种情况下可行吗?根据这些内存要求,推荐的解决方案是什么?

跳出框框思考。在 Unix-esqe 环境中执行此操作的最简单方法如下:

cat file1 file2 file3 file4 > output

无需直接读取文件。在 Windows 上它将是

C:\ copy file1 file2 file3 file4 output

要做到这一点,在 Linux.

中有关于如何 运行 命令行程序的 great post

坚持纯 pythonic 解决方案(我假设您有理由不使用 Linux 中的 'cat' 或 Windows 中的 'copy'):

with open('out_bin','wb') as wfd:
    for f in filepaths:
        with open(f,'rb') as fd:
            # 1MB per writing chunk.
            shutil.copyfileobj(fd, wfd, 1024 * 1024 * 1)

将可靠、高效地完成工作。

要点是在二进制模式下写入和读取('wb','rb'),以避免未经请求的换行符转换污染最终结果,否则可能会发生这种情况,从而破坏最终的二进制文件。

如果您正在寻找最快的方法,那么您可能需要针对您表示感兴趣的其他方法进行基准测试,我看不到任何保证获胜者所述基准不会在某种程度上 OS 依赖。