如何将文件从Google云存储打开到云功能

时间:2018-10-14 16:59:53

标签: python google-cloud-platform google-cloud-storage google-cloud-functions

这是我通常将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,但是我不确定如何将其应用于上述情况。

2 个答案:

答案 0 :(得分:1)

使用Cloud Storage XML API,您可能 能够接近您的#1示例。

应该在Cloud Functions中实现它应该没有问题,因为它完全基于标准HTTP请求。

您可能正在寻找GET ObjectDownload 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。请注意,如果连接丢失,您可能需要实施重试策略。