【问题标题】:wget with big data file straight to s3wget 与大数据文件直接到 s3
【发布时间】:2022-02-09 21:43:53
【问题描述】:

我正在使用 wget 使用以下命令从www.backblaze.com url 直接通过管道传输到 S3:

> wget -qO- '<url>' | aws s3 cp - s3://<bucket>/{data_file}

这是一个文件,其大小可以在 10 到 20Gb 之间。我已经使用 Python 脚本运行了几次该过程,其中包含以下内容:

os.system('wget -qO- '<url>' | aws s3 cp - s3://<bucket>/{data_file}')

当该过程完成时,我没有收到任何错误,但是我的 s3 存储桶中的文件大小只有 ~4 或 5Gb,这表明整个文件没有被读取或写入管道。

我不确定这里有什么问题。有没有人使用 wget 来管道大数据文件的经验?

【问题讨论】:

  • 当你从 shell 而不是从 python 运行它时它是否正常工作?
  • 是的,但我需要通过 Python 运行它
  • 我们理解这一点。但是证明它在python 外部 工作,可以确认问题可能不在于您的网络,或者wgetaws 命令,这缩小了可能的问题。老实说,我们通常问这些问题是有充分理由的。
  • Amazon S3 从不添加部分对象。如果生成的 S3 对象不包含正确和完整的数据,那是因为您的客户端没有发送正确的数据(这可能表明读取以某种方式失败)。
  • PS 对这里的故障缺乏可见性正是您不使用 os.system() 运行脚本的原因。也就是说,调整你的命令行,让它向一个文件发出错误,然后你可以查看它,并考虑使用它的详细选项。

标签: python amazon-web-services amazon-s3 wget


【解决方案1】:
os.system('wget -qO- '<url>' | aws s3 cp - s3://<bucket>/{data_file}')

请注意python 中从使用os.system 到使用subprocess 内置模块的一般移动。 os module docs 声称 os.system

这是通过调用标准 C 函数 system() 来实现的,并且 有同样的限制。

我不是标准C函数system()-ninja所以我不能说是否有不要使用|上面的分支,但无论如何我建议使用subprocess 内置模块替换os.system,这似乎是python 开发人员之间的普遍运动。管道示例见Replacing shell pipeline in subprocess docs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 2018-12-15
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    相关资源
    最近更新 更多