Загрузите gpickle NetworkX из S3 в лямбда-AWS - PullRequest
0 голосов
/ 25 июня 2019

Как видно из заголовка, я пытаюсь использовать Amazon Lambda для загрузки графика NetworkX из S3, и я хотел бы использовать gpickle, потому что это файл гораздо меньшего размера, чем JSON. Я смог нормально загрузить 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 лямбда-чтения с формы S3. Как загрузить данные gpickle из S3 в лямбду?

1 Ответ

0 голосов
/ 25 июня 2019

Я посмотрел исходный код для NetworkX и обнаружил, что он просто вызывает return pickle.load(path) при использовании read_gpickle(path) в mode=rb. Таким образом, проблема в том, что 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())

и это работает. Результатом является неразличимая форма загрузки JSON из S3 и загрузки gpickle локально, используя метод Network.

Вместо того, чтобы удалить мой вопрос, я решил опубликовать его здесь с ответом, чтобы будущие люди могли сэкономить время при загрузке сетевых данных в AWS.

...