我从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非常受欢迎。
答案 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以在链式任务中附加数据。但我还没试过。