【发布时间】: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