这是我通常将GCS文件下载到本地的方式:
storage_client = storage.Client()
bucket = storage_client.get_bucket('mybucket')
blob = bucket.blob('myBigFile.txt')
blob.download_to_filename('myBigFile.txt)
我正在使用的文件比Cloud Functions的允许大小/内存大得多(例如,几GB到几TB),因此以上内容不适用于这些大文件。
在Cloud Function中使用GCS文件是否有更简单的“流”(请参见下面的示例1)或“直接访问”(请参见下面的示例2)的方式?
我想要做的两个例子是:
# 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,但是我不确定如何将其应用于上述情况。
答案 0 :(得分:1)
使用Cloud Storage XML API,您可能 能够接近您的#1示例。
应该在Cloud Functions中实现它应该没有问题,因为它完全基于标准HTTP请求。
您可能正在寻找GET Object的Download an Object请求:
对对象的GET请求可以包含Range标头,如 HTTP 1.1 RFC来限制返回的数据范围 对象,但请注意,在certain circumstances范围内 标头将被忽略。
该HTTP Range标头似乎可用于实现您要查找的“块”(但作为独立请求,而不是在“流”模式下):
您要在响应中返回的字节范围,或者 已上传到Cloud Storage系统的字节范围。
有效值
任何连续的字节范围。
示例
Range: bytes=0-1999
(前2000个字节)
Range: bytes=-2000
(最后2000个字节)
Range: bytes=2000-
(从字节2000到文件末尾)实施细节
Cloud Storage不处理复杂的不连续范围,但可以处理 支持简单的连续字节范围。另外,字节范围是 包括的;也就是说,bytes = 0-999代表a中的前1000个字节 文件或对象。有效且成功的请求将产生206 Partial Content响应代码。有关更多信息,请参见 specification。
由于范围是静态的,因此不太可能找到完全适合的范围值以使块完全匹配存储的数据“边界”。因此,您可能需要选择一些重叠的块,才能捕获数据,否则这些数据将被分成2个块。
注意:我没有尝试过,答案仅基于文档。
答案 1 :(得分:0)
在撰写本文时,标准的Google Cloud Client库不支持类似流的up / download。
看看GCSFS。请注意,如果连接丢失,您可能需要实施重试策略。