如何将文件从Google云存储打开到云函数
问题描述
我通常是这样将GCS文件下载到本地的:
storage_client = storage.Client()
bucket = storage_client.get_bucket('mybucket')
blob = bucket.blob('myBigFile.txt')
blob.download_to_filename('myBigFile.txt)
我使用的文件比云函数允许的大小/内存大得多(例如,几GB到几TB),因此上面的方法不适用于这些大文件。
在云函数中是否有更简单的"流式处理"(参见下面的示例1)或"直接访问"(参见下面的示例2)的方式来处理GCS文件?
我要做的两个例子是:
# 1. Load it in chunks of 5GB -- "Streaming"
storage_client = storage.Client()
bucket = storage_client.get_bucket('mybucket')
blob = bucket.blob('myBigFile.txt')
while True:
data = blob.download_to_filename('myBigFile.txt', chunk_size=5GB)
do_something(data)
if not data: break
或:
# 2. Read the data from GCS without downloading it locally -- "Direct Access"
storage_client = storage.Client()
bucket = storage_client.get_bucket('mybucket')
blob = bucket.blob('myBigFile.txt')
with blob.read_filename('myBigFile.txt') as f:
do_something(f)
我不确定是否可以做到这两点,但我给出了一些如何工作的选择。似乎支持Streaming Option,但我不确定如何将其应用于上述情况。
解决方案
您可能能够使用Cloud Storage XML API实现与您的第一个示例相近的功能。
在云函数内实现它应该不会有问题,因为它完全基于标准HTTP请求。
您可能正在查找GET Object对Download an Object的请求:
对象的GET请求可以包括在中定义的Range标头 HTTP 1.1 RFC将返回数据的范围限制在 对象,但请注意,在certain circumstances范围中 已忽略标头。HTTPRange标头似乎可用于实现您正在寻找块(但作为独立请求,而不是在流式模式下):
要在响应中返回的字节范围,或 已上传到云存储系统的字节范围。有效值
任何连续的字节范围。
示例
Range: bytes=0-1999
(前2000字节)
Range: bytes=-2000
(最后2000个字节)
Range: bytes=2000-
(从字节2000到文件结尾)实施详情
云硬盘不处理复杂的不相交范围,但它处理复杂的不相交范围 支持简单的连续字节范围。此外,字节范围还包括 包括在内;也就是说,字节=0-999表示 文件或对象。有效且成功的请求将导致 部分内容响应代码。有关更多信息,请参阅 specification。
由于范围将是静电,因此您不太可能找到完全适合的范围值来使区块与存储的数据完美匹配&边框和边框。因此,您可能需要选择稍微重叠的区块,以便能够捕获本来会拆分为2个区块的数据。
注意:我没有尝试此操作,答案仅基于文档。
相关文章