在 Python 中写入流到 Google Cloud Storage

Yan*_*ler 11 python azure-storage google-cloud-storage aws-lambda google-cloud-functions

我正在尝试迁移AWS Lambda编写的函数PythonCF

  1. 即时解压缩并逐行阅读
  2. 在每一行上执行一些光变换
  3. 将未压缩的输出(一次一行或块)写入 GCS

输出 > 2GB - 但略小于 3GB 所以它适合Lambda只是.

好吧,这似乎是不可能的,或者更多地涉及GCP

  • 未压缩的无法放入内存或/tmp- 在撰写本文时限制为 2048MB - 所以 Python 客户端库upload_from_file(或_filename无法使用)
  • 这篇官方论文,但令我惊讶的是,它指的是boto一个最初为 设计的库AWS S3,并且已经过时boto3了一段时间。没有真正的GCP流式写入或读取方法
  • Node.js的有一个简单的createWriteStream()-好的文章在这里顺便说一句-但没有相应的一行代码在Python
  • 可恢复的媒体上传听起来很像,但很多代码在 Node 中处理要容易得多
  • AppEngine 有云存储,但在它之外不可用 - 并且已经过时
  • 在一个工作包装器上几乎没有例子,用于逐行写入文本/纯数据,就像GCS是本地文件系统一样。这不仅限于Cloud FunctionsPython Client 库所缺乏的功能,而且由于资源限制,它在 CF 中更为突出。顺便说一句,我参与了添加可写 IOBase 函数的讨论,但它没有吸引力。
  • 显然使用虚拟机或DataFlow手头的任务是不可能的。

在我看来,来自基于云的存储的流(或类似流)读/写甚至应该包含在 Python 标准库中。

正如当时所推荐的那样,人们仍然可以使用GCSFS,它会在您将内容写入FileObj 时,在幕后为您分块提交上传。同一个团队写的s3fs。我不知道 Azure。

AFAIC,我会坚持,AWS Lambda因为输出可以适合内存 - 现在 - 但分段上传是支持任何输出大小且内存最少的方法。

想法或替代方案?

Yan*_*ler 5

multipart我对上传与上传感到困惑resumable。后者是“流式传输”所需的 - 它实际上更像是上传缓冲流的块。

Multipart上传是在同一个 API 调用中一次性加载数据和自定义元数据。

虽然我非常喜欢GCSFS - Martin,他的主要贡献者反应非常灵敏 -,但我最近找到了一个使用该google-resumable-media库的替代方案。

GCSFS是基于核心 http API 构建的,而 Seth 的解决方案使用由 Google 维护的低级库,与 API 更改更加同步,并且包括指数备份。后者对于大/长流来说确实是必须的,因为连接可能会下降,即使在内部GCP- 我们面临着GCF.

最后,我仍然相信Google Cloud Library是添加类似流的功能的正确位置,具有基本的writeread. 它已经有了核心代码

如果您也对核心库中的该功能感兴趣,请在这里点赞该问题- 假设优先级基于此。