【问题标题】:Load npy file from S3 in python在 python 中从 S3 加载 npy 文件
【发布时间】:2020-10-29 04:59:42
【问题描述】:

无论如何在 numpy 中加载/读取外部文件(即 AWS S3)?我有几个 npy 文件存储在 S3 中。我尝试通过 S3 预签名 url 访问它们,但似乎 numpy.load 方法或 np.genfromtxt 都无法读取它们。

我不想在本地文件系统上保存文件,然后在 numpy 上加载它们。

有什么想法吗?

【问题讨论】:

  • 当然你需要一些额外的层来完成所有的网络协议工作! Numpy 的 IO 可能仅设计用于基于文件的 IO。在 Python3 中,你可以试试import request; import BytesIO; request = requests.get(url); np.load(BytesIO(request.content))
  • 当然,我的 sn-p 假设 S3-link 是公共的,无需身份验证。我不知道是不是这样。如果没有,您将需要一些库来执行此身份验证来访问文件!
  • 你能用requests读取文件吗?
  • 您好,无法阅读。最后,我使用了使之成为可能的 spark textFiles。谢谢!!

标签: python numpy amazon-s3


【解决方案1】:

使用s3fs

import numpy as np
from s3fs.core import S3FileSystem
s3 = S3FileSystem()

key = 'your_file.npy'
bucket = 'your_bucket'

df = np.load(s3.open('{}/{}'.format(bucket, key)))

您可能需要根据要读取的文件设置allow_pickle=True

【讨论】:

    【解决方案2】:

    我比较了 s3fs 和 io.BytesIO 从 s3 加载 28G npz 文件。 s3fs 需要 30 分钟,而 io 需要 12 分钟。

    obj = s3_session.resource("s3").Object(bucket, key)
    with io.BytesIO(obj.get()["Body"].read()) as f:
        f.seek(0)  # rewind the file
        X, y = np.load(f).values()
    
    s3fs = S3FileSystem()
    with s3fs.open(f"s3://{bucket}/{key}") as s3file:
         X, y = np.load(s3file).values()
    

    【讨论】:

    • s3fs 即使对于几个 npys 也确实很慢
    【解决方案3】:

    我成功使用了boto 和 StringIO。 使用 boto 连接到 S3 并获取您的存储桶。然后将带有以下代码的文件读入numpy:

      import numpy as np
      from StringIO import StringIO
      key=bucket.get_key('YOUR_KEY')
      data_string=StringIO(key.get_contents_as_string())
      data = np.load(data_string)
    

    我不确定这是最有效的方式,但它不需要公共 URL。

    干杯, 迈克尔

    【讨论】:

      猜你喜欢
      • 2014-07-29
      • 1970-01-01
      • 2021-11-04
      • 2011-09-11
      • 2016-10-16
      • 2020-10-17
      • 2019-01-18
      • 2020-05-24
      • 1970-01-01
      相关资源
      最近更新 更多