0

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

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

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

你能解释一下如何:

  • read()
  • write(.., 'wb')
  • write(.., 'ab')
  • shutil.copyfileobj()
  • mmap

在这种情况下会起作用,根据这些内存要求,推荐的解决方案是什么?

4

2 回答 2

2

坚持纯粹的 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')进行写入和读取,以避免可能发生的未经请求的换行符转换污染最终结果,从而破坏最终的二进制文件。

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

于 2017-01-12T03:31:11.213 回答
0

创造性思考。在 Unix-esqe 环境中执行此操作的最简单方法是:

cat file1 file2 file3 file4 > output

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

C:\ copy file1 file2 file3 file4 output

为此,有一篇很棒的文章介绍了如何在 Linux 中运行命令行程序。

于 2017-01-12T03:16:58.660 回答