Как сохранить объект графа networkx при перезагрузках? - PullRequest
0 голосов
/ 08 апреля 2020

Я разрабатываю сервер, который загружает граф networkX из файла gpickle и по запросу getDerivedData читает все, что ему нужно, из этого графического объекта и дает ответ. Я держу это как правило c, потому что детали getDerivedData не важны.

Так как я разрабатываю это, мне нужна жесткая обратная связь l oop. Для этого я хочу перезагрузить свой сервер при изменении кода. Проблема в том, что файл gpickle довольно большой (> 400 МБ) и загрузка его при каждой перезагрузке занимает слишком много времени.

Вопрос

Есть ли способ получить loading graph и serving requests как две независимые вещи, так что если я изменю код сервера, graph останется в памяти, но server перезагрузится с новыми изменениями?

Вещи, которые я пытался

Поскольку я не слишком знаком с python, я пробовал несколько вещей безуспешно

  • Раскрутил сервер pyro4 , который загружает график и обслуживает его. Оказывается, я не могу просто отправить объект Python Графика напрямую, так как он не знает, как его сериализовать.
  • Я подумал, может быть, если я прочитаю файл gpickle в двоичном виде и сохраню его на этом сервере, когда клиент запрашивает файл, он будет отправлен через сокет. Я думал, что это будет быстрее, чем чтение с диска. Я получаю аналогичную производительность
  • Я пытался использовать brain-plasma , чтобы иметь глобальный магазин. Та же проблема с сериализацией
  • Я пытался использовать библиотеку reloadr . Я бы поместил код загрузки в начало моего скрипта, и у меня был бы основной файл, который раскручивал http-сервер. Когда я изменяю код, он либо
    • вообще не реагирует на изменения
    • реагирует, но вылетает, говоря, что не может найти исходный код (wut?)

Часть, которая будет сохранена

Это просто

import networkx as nx
G = nx.read_gpickle('big_file.gpickle')
G = nx.Graph(G)
...