在App Engine上将大CSV文件写入GCS

时间:2014-12-17 13:18:25

标签: python google-app-engine csv google-cloud-storage

我从Google App Engine数据存储区(使用Python)中提取大量数据,我需要将其写入GCS(Google云端存储)上的csv文件。

我通过使用iter查询获取~10k实体并推迟执行任务来完成此任务。 不幸的是,GCS不支持附加到文件,因此在每次运行任务时我都被迫打开并读取整个文件,关闭它,然后将内容写入新文件并添加新获取的一批数据。

我使用UnicodeWriter / UnicodeReader来处理类似于的csv文件: https://docs.python.org/2/library/csv.html#examples

我的问题是,当文件变大时,往往会占用大量实例内存,有时会超出限制。在这种情况下,有没有办法最大限度地减少大量内存使用?

处理大型csv文件的任何示例> GCS上的32MB非常受欢迎。

2 个答案:

答案 0 :(得分:4)

Google云端存储可以愉快地接受基本上无限大小的对象,但您的问题有点不同,即首先构建对象。

您可以使用Google云端存储的撰写支持来提供帮助。但是,撰写有限制。最多可以组合1024个对象(每个调用32个对象,但是可以组合该对象的结果,也可以组合该对象的结果,依此类推,直到有1024个原始源对象组成一起)。因此,只有将总大小分成1024个才能使它们足够小以适应您的使用情况,才能使用合成。

然而,这可能还不错。如果是这样,这里有一些资源:

撰写功能的文档:https://cloud.google.com/storage/docs/composite-objects#_Compose

我不确定您是否正在使用App Engine云存储库,但如果您使用它,很遗憾不支持撰写。您必须抓住更通用的Google API Python客户端并调用对象#compose方法,在此处记录:https://cloud.google.com/storage/docs/json_api/v1/objects/compose

以下是使用它的相关示例:

composite_object_resource = {
        'contentType': 'text/csv',  # required
        'contentLanguage': 'en',
}
compose_req_body = {
        'sourceObjects': [
                {'name': source_object_name_1},
                {'name': source_object_name_2}],
        'destination': composite_object_resource
}
req = client.objects().compose(
        destinationBucket=bucket_name,
        destinationObject=composite_object_name,
        body=compose_req_body)
resp = req.execute()

答案 1 :(得分:-1)

当你写一些like时:

with gcs.open(gcs_filename, 'w', content_type=b'multipart/x-zip') as gf:
    ....

这里gf是一个cloudstorage.storage_api.StreamingBuffer,它可以被pickle以在链式任务中附加数据。但我还没试过。