2

我需要实现的是使用库将文件列表连接到单个文件中cloudstorage。这需要在 mapreduce 分片内进行,该分片的内存上限为 512MB,但连接的文件可能大于 512MB。

当文件大小达到内存限制时,以下代码段会中断。

list_of_files = [...]
with cloudstorage.open(filename...) as file_handler:
    for a in list_of_files:
        with cloudstorage.open(a) as f:
            file_handler.write(f.read())

有没有办法绕过这个问题?也许以块的形式打开或附加文件?以及如何做到这一点?谢谢!

== 编辑 ==

经过更多测试,似乎内存限制仅适用于f.read(),而写入大文件是可以的。分块读取文件解决了我的问题,但我真的很喜欢compose()@Ian-Lewis 指出的函数。谢谢!

4

1 回答 1

2

对于大文件,您需要将文件分解为更小的文件,上传每个文件,然后将它们合并为复合对象。您将需要使用库中的compose()函数。似乎还没有文档

上传所有部分后,如下所示应该可以工作。要确保的一件事是,要组合的路径文件在开头不包含存储桶名称或斜杠。

stat = cloudstorage.compose(
    [
        "path/to/part1",
        "path/to/part2",
        "path/to/part3",
        # ...
    ],
    "/my_bucket/path/to/output"
)

如果可能,您可能还想使用 gsutil 工具进行检查。它可以为你做大文件的自动拆分、并行上传和合成

于 2015-07-27T08:29:59.093 回答