Python 如何使用任务链写入cloudstorage,blobstore文件API做得很好
使用blobstore文件API,我可以编写非常大的BlobFile: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解决方案
- 创建一个blobfile
- 从数据存储中读取数据并写入(追加)到blobstore文件
- 将数据存储页面光标和blobstore文件传递给(下一个)任务
- ..为相同目的使用其他任务
- 并完成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()之后打开