【问题标题】:How to open a file from google cloud storage into a cloud function如何将谷歌云存储中的文件打开到云功能中
【发布时间】:2019-03-19 04:33:09
【问题描述】:

这是我通常将 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),因此上述方法不适用于这些大文件。

是否有更简单的“流式传输”(参见下面的示例 1)或“直接访问”(参见下面的示例 2)方式来处理 Cloud Function 中的 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,但我不确定如何将其应用于上述情况。

【问题讨论】:

  • 您能否评论一下您计划如何在您的函数中使用包含在云存储桶对象中的数据?也许如果我们知道如何使用数据,我们可以提供更好的指导?
  • @Kolban 我刚刚用几个例子更新了这个问题。我将数据保存为新的文件类型(例如 avro)或将其插入数据库。
  • 这可能是你想要的吗? stackoverflow.com/questions/50380237/…

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


【解决方案1】:

可能可以使用Cloud Storage XML API 实现接近您的#1 示例的效果。

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

您可能正在寻找对Download an ObjectGET 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 代表一个文件中的前 1000 个字节 文件或对象。有效且成功的请求将产生206 Partial Content 响应代码。有关详细信息,请参阅 specification.

由于范围是静态的,因此您不太可能找到完全适合的范围值以使块与存储的数据“边界”完美匹配。因此,您可能需要选择重叠一点的块,以便能够捕获否则会被分成 2 个块的数据。

注意:我没有尝试过,答案仅基于文档。

【讨论】:

    【解决方案2】:

    在撰写本文时,标准的 Google Cloud 客户端库不支持流式上传/下载。

    看看GCSFS。请注意,您可能需要实施重试策略以防连接丢失。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-20
      • 2021-08-20
      • 2023-04-10
      • 2023-02-08
      • 2020-06-10
      • 1970-01-01
      • 2023-02-13
      • 2022-12-17
      相关资源
      最近更新 更多