在 Python 中写入流到 Google Cloud Storage

我正在尝试迁移一个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因为输出可以适合内存 - 现在 - 但分段上传是支持任何输出大小且内存最少的方法。

想法或替代方案?


互换的青春
浏览 161回答 2
2回答

叮当猫咪

smart_open现在支持 GCS 并支持即时解压。import lzmafrom smart_open import open, register_compressordef _handle_xz(file_obj, mode):    return lzma.LZMAFile(filename=file_obj, mode=mode, format=lzma.FORMAT_XZ)register_compressor('.xz', _handle_xz)# stream from GCSwith open('gs://my_bucket/my_file.txt.xz') as fin:    for line in fin:        print(line)# stream content *into* GCS (write mode):with open('gs://my_bucket/my_file.txt.xz', 'wb') as fout:    fout.write(b'hello world')

慕勒3428872

我multipart对 vs.resumable上传感到困惑。后者是“流媒体”所需要的——它实际上更像是上传缓冲流的块。Multipart 上传是在同一个 API 调用中一次加载数据和自定义元数据。虽然我非常喜欢GCSFS - Martin,他的主要贡献者非常敏感 - 但我最近发现了一个使用该google-resumable-media库的替代方案。GCSFS建立在核心 http API 之上,而 Seth 的解决方案使用由 Google 维护的低级库,与 API 更改更加同步,其中包括指数备份。后者对于大/长流来说确实是必须的,因为连接可能会下降,即使在内部GCP- 我们遇到了GCF.最后,我仍然相信Google Cloud Library是添加类似流的功能的正确位置,包括基本write和read. 它已经有了核心代码。如果您也对核心库中的该功能感兴趣,请在此处竖起大拇指- 假设优先级基于此。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python