【问题标题】:Working with large networkx graph and Flask webserver使用大型 networkx 图和 Flask 网络服务器
【发布时间】:2018-05-11 12:57:30
【问题描述】:

我正在尝试创建一个 Flask Web 应用程序,该应用程序可以查询 NetworkX 图,以返回最短路径(使用 Dijkstra 的算法,加上 Yen 的 k 最短路径算法)。

这是我的示例代码(去掉了错误处理,只显示了 Dijkstra 实现),如果您向localhost:3000/d?source=a&target=b 提交 GET 请求,它将返回路径:

import csv
import json
import networkx as nx
from flask import Flask, request

app = Flask(__name__)
G = nx.Graph()

@app.route('/d')
def dijkstra():

  global G

  source = request.args['source'].lower().strip()
  target = request.args['target'].lower().strip()

  path = nx.dijkstra_path(G, source, target, weight='weight')

  return json.dumps(path)


if __name__ == '__main__':

  global G

  with open('nodes.csv', 'rb') as f:
    reader = csv.reader(f)
    node_list = list(reader)

  for i in nodes:
    G.add_node(i[0])

  with open('edges.csv', 'rb') as f:
    reader = csv.reader(f)
    edge_list = list(reader)

  for i in edges:
    G.add_edge(i[0], i[1], weight=i[2])

  app.run(host='0.0.0.0', port=3000, use_reloader=False)

该图非常大(一百万个节点,两千万条边),因此我目前在应用加载时从 CSV 填充它,而不是为每个请求构建它。在我的 MacBook Pro(3GHz,16GB RAM)上本地运行时,这大约需要五分钟。查找需要的时间不同,但通常在 15 秒左右,并且在使用一定量后性能通常会下降,这意味着我必须重新启动应用程序。

问题一:因为这很慢且占用大量内存,有没有办法存储此图,这样我就不必每次都生成它,然后将其保存在内存中?

问题二:我使用G作为全局变量的方法是否正确?

我以前没有使用过这么大的图表,所以我知道我的实现可能远非理想,如果有任何关于如何使其表现更好/更可靠的想法,我将不胜感激!

【问题讨论】:

  • PS 这里是记录每个阶段的脚本版本的示例计时,因此您可以看到时间花费在哪里:从开始到加载 1,014,896 个节点的 3.6 秒;从开始(∴ 95.4 秒)到加载 20,025,902 条边需要 99.0 秒;从开始(∴ 5.9 秒)到将节点添加到图形需要 101.3 秒; 330.9 秒从开始(∴ 229.6 秒)到向图形添加边。

标签: python flask networkx graph-theory


【解决方案1】:

您是否尝试过使用市场中可用的缓存?

创建一个更新这些缓存或泡菜的后台脚本,您的请求只加载和发送其中的数据。

编辑 由于 OP 还在 NetworkX 上找到了 Builtin Pickles Method enter link description here

比较酸洗和直接处理CSV的速度Check this link

编辑 2 当您腌制整个数据结构时,您会受到系统 RAM 的限制。但是,您可以分块进行。

streaming-pickle 可以作为酸洗大于板上内存的对象的解决方案。因为在 unpickling 时会出现问题,但您也可以使用这种方法来克服它。

或者用 Redis 的方式,如果你希望数据在请求完成的情况下被持有你可以寻找Redis Cluster

这是一个很大的问题:D 取决于您实际需要什么。

【讨论】:

  • 感谢您的快速回复!看起来 NetworkX 具有读取/写入泡菜的功能(networkx.github.io/documentation/networkx-1.9.1/reference/…)。这是你的意思吗?当必须加载整个图形时,这不会产生相同的内存问题吗?
  • Wunderbar,如果它有内置的picke写入:D。您可以在此处比较响应时间stackoverflow.com/a/37012035/6198978 Pickles 和 HDF5 比 CSV 快得多。
  • 现在试试——会让你知道的。再次感谢! :)
  • 不走运 :( 尝试创建泡菜花了大约 20 分钟,然后我收到了 Killed: 9 消息。还有其他想法吗?
  • StackOverflow 还是 OutofMem?它显示什么错误?
猜你喜欢
  • 2015-10-30
  • 2019-08-04
  • 1970-01-01
  • 2014-05-06
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多