为了账号安全,请及时绑定邮箱和手机立即绑定

在 Python 中写入流到 Google Cloud Storage

在 Python 中写入流到 Google Cloud Storage

互换的青春 2021-07-27 04:37:43
我正在尝试迁移一个AWS Lambda写入PythonCF的函数即时解压缩并逐行阅读在每一行上执行一些光变换将未压缩的输出(一次一行或块)写入 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因为输出可以适合内存 - 现在 - 但分段上传是支持任何输出大小且内存最少的方法。想法或替代方案?
查看完整描述

2 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

smart_open现在支持 GCS 并支持即时解压。


import lzma

from smart_open import open, register_compressor


def _handle_xz(file_obj, mode):

    return lzma.LZMAFile(filename=file_obj, mode=mode, format=lzma.FORMAT_XZ)


register_compressor('.xz', _handle_xz)


# stream from GCS

with 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')


查看完整回答
反对 回复 2021-08-03
?
慕勒3428872

TA贡献1848条经验 获得超6个赞

multipart对 vs.resumable上传感到困惑。后者是“流媒体”所需要的——它实际上更像是上传缓冲流的块。

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

虽然我非常喜欢GCSFS - Martin,他的主要贡献者非常敏感 - 但我最近发现了一个使用该google-resumable-media的替代方案

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

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

如果您也对核心库中的该功能感兴趣,请在此处竖起大拇指- 假设优先级基于此。


查看完整回答
反对 回复 2021-08-03
  • 2 回答
  • 0 关注
  • 160 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信