Python 如何使用任务链写入cloudstorage,blobstore文件API做得很好

Python 如何使用任务链写入cloudstorage,blobstore文件API做得很好,python,google-app-engine,python-2.7,google-cloud-storage,blobstore,Python,Google App Engine,Python 2.7,Google Cloud Storage,Blobstore,使用blobstore文件API,我可以编写非常大的BlobFile: 创建一个blobfile 从数据存储中读取数据并写入(追加)到blobstore文件 将数据存储页面光标和blobstore文件传递给(下一个)任务 ..为相同目的使用其他任务 并完成blobstore文件 现在使用GAE GCS客户端,我无法追加和完成。如何将非常大的文件写入GCS而无需编写。Compose不是GCS客户端的一部分。filesapi仍然可以正常工作,但已被弃用 在使用任务链接的blobstore解决方案

使用blobstore文件API,我可以编写非常大的BlobFile:

  • 创建一个blobfile
  • 从数据存储中读取数据并写入(追加)到blobstore文件
  • 将数据存储页面光标和blobstore文件传递给(下一个)任务
  • ..为相同目的使用其他任务
  • 并完成blobstore文件
现在使用GAE GCS客户端,我无法追加和完成。如何将非常大的文件写入GCS而无需编写。Compose不是GCS客户端的一部分。filesapi仍然可以正常工作,但已被弃用

在使用任务链接的blobstore解决方案下方:

class BlobData(webapp2.RequestHandler):

    def post(self):

        page = int(self.request.get('page', default_value='0'))
        data = Data.get_data(.....)

        blob_file = self.request.get('blobfile', default_value='none')
        if blob_file == 'none':
            file_name = files.blobstore.create(mime_type='text/...',
                                               _blobinfo_uploaded_filename='data....txt')
        else:
            data.with_cursor(self.request.get('cursor'))

        count = 0  # page lines counter
        with files.open(blob_file, 'a') as f:
            for each in data.fetch(page):
                f.write(each)
                count += 1

        if count >= page:
            cursor = data.cursor()
            taskqueue.add(url='/blobdata', queue_name='blobdata', countdown=10, method='POST',
                          params={'page': page, 'cursor': cursor, 'blobfile': blob_file},
                          headers={'X-AppEngine-FailFast': 'True'})
        else:  # no data left
            files.finalize(blob_file)

在Java客户机中,我们可以序列化读取通道(相当于Python客户机中的缓冲区),并将其传递给另一个任务以继续在同一文件中写入。有关更多信息,请参阅:

一个可读字节通道,用于将数据读取到谷歌云存储。 此类的实现可以在内部缓冲数据以减少 远程呼叫

该类是可序列化的,允许 读取文件的一部分,序列化GcsInputChannel反序列化 然后从同一位置继续读取同一文件。

我不知道Python GCS客户机返回的缓冲区是否可以序列化,我在文档中没有找到任何信息,但可能值得检查

如果这是不可能的,那么使用合成。不要担心GCS客户端中没有组件,您可以始终使用App Engine中的标准云存储API库。API文档中有一个Python中的
compose
示例。看起来是这样的:

composite_object_resource = {
        'contentType': 'text/plain',  # required
        'contentLanguage': 'en',
        'metadata': {'my-key': 'my-value'},
}
compose_req_body = {
        'sourceObjects': [
                {'name': source_object_name_1,
                 'objectPreconditions': {'ifGenerationMatch': source_generation_1}},
                {'name': source_object_name_2,
                 'objectPreconditions': {'ifGenerationMatch': source_generation_2}}],
        'destination': composite_object_resource
}
req = client.objects().compose(
        destinationBucket=bucket_name,
        destinationObject=composite_object_name,
        body=compose_req_body)
resp = req.execute()
print json.dumps(resp, indent=2)

你的问题是什么?我需要写非常大的文件(从数据存储到GCS)。如何使用地面军事系统?Thnx David。我还发现,因为我正在写:GcsOutputChannel和有趣的评论。我希望有人能帮助我了解您的建议是否可用,或者是否可以用于Python。是的,在Python中,cloudstorage.storage\u api.StreamingBuffer可以被pickle,并在pickle.loads()之后打开