【问题标题】:Load a NetworkX gpickle from S3 into AWS lambda将 NetworkX gpickle 从 S3 加载到 AWS lambda
【发布时间】:2019-06-25 07:27:12
【问题描述】:

正如标题所说,我正在尝试使用 Amazon lambda 从 S3 加载 NetworkX 图,并且我想使用 gpickle,因为它的文件大小比 JSON 小得多。使用this solution 的轻微改编,我能够很好地加载网络的 JSON 版本。但是,当我尝试调整它以使用 NetworkX gpickle 命令时:

import boto3
import networkx as nx

s3 = boto3.resource('s3')
my_graph = nx.read_gpickle(s3.Bucket("bucket_name").Object("key_to_pickle.gpickle").get()['Body'].read())

它不起作用。具体来说,我收到了一个TypeError: file must have 'read' and 'readline' attributes 错误,它不能帮助我弄清楚 gpickle 案例有什么问题/不同。

这可能是 NetworkX gpickle 方法特有的。或者它可能是 AWS lambda 从 S3 读取文件的一般性。如何将我的 gpickle 数据从 S3 加载到 lambda 中?

【问题讨论】:

    标签: python-3.x amazon-s3 aws-lambda pickle networkx


    【解决方案1】:

    我查看了NetworkX的源代码,发现它在mode=rb中使用read_gpickle(path)时只是调用了return pickle.load(path)。所以问题是 NetworkX 想要一个文件名,但 AWS lambda 不能那样做。

    NetworkX 方法似乎没有做任何额外的工作来将响应转换为 NetworkX 图形数据。也就是说,如果 NewtorkX 只使用pickle.load(path),那么我猜它可以直接使用pickle.loads(data_object)。我试过了:

    my_graph = pickle.loads(s3.Bucket("bucket_name").Object("key_to_pickle.gpickle").get()['Body'].read())
    

    它有效。结果与从 S3 加载 JSON 并使用 Network 的方法在本地加载 gpickle 的形式无法区分。

    我没有删除我的问题,而是决定在这里发布一个答案,以便未来的人们可以节省将网络数据加载到 AWS 的时间。

    【讨论】:

      猜你喜欢
      • 2018-06-25
      • 2021-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-27
      • 2018-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多