我需要能操控一个大(10^7节点)曲线在蟒蛇。该数据对应的每个节点/边是最小的,也就是说,一个小数字符串。什么是最有效,在条款 存储器和速度, 方式这样做?

字典的字典更为灵活和更易于实现,但我直观地期待一个列表中列出了要快。本列表的选择也将要求我保持的数据单独的结构,而字典将允许东西的排序:

graph[I][J]["Property"]="value"

你有什么建议吗?


是的,我应该已经有点更加清晰对我所说的效率。在这种特定情况下,我的意思是它在随机访问检索。

将数据加载到存储器不是一个巨大的问题。这样做了。耗费时间的一部分访问的节点所以我可以提取的信息和测量的指标,我很感兴趣。

我没有考虑使每个节点一类(性质是相同的所有节点),但它似乎是,将增加一个额外的层的开销?我希望有人会有一些直接经验,与一个类似的情况,他们可以分享。毕竟,图都是最常见的一个抽象在CS。

有帮助吗?

解决方案

我强烈主张,你看看 NetworkX.这是一个久经考验的战马和第一工具最'研究'类型的达到时,他们需要做分析的基于网络的数据。我们操纵图100万的边没有问题在一个笔记本。它的特点丰富和非常容易使用。你会发现自己更加关注的问题而不是细节在基础实施。

所有单-Rényi 随机的曲线图产生和分析


"""
Create an G{n,m} random graph with n nodes and m edges
and report some properties.

This graph is sometimes called the Erd##[m~Qs-Rényi graph
but is different from G{n,p} or binomial_graph which is also
sometimes called the Erd##[m~Qs-Rényi graph.
"""
__author__ = """Aric Hagberg (hagberg@lanl.gov)"""
__credits__ = """"""
#    Copyright (C) 2004-2006 by 
#    Aric Hagberg 
#    Dan Schult 
#    Pieter Swart 
#    Distributed under the terms of the GNU Lesser General Public License
#    http://www.gnu.org/copyleft/lesser.html

from networkx import *
import sys

n=10 # 10 nodes
m=20 # 20 edges

G=gnm_random_graph(n,m)

# some properties
print "node degree clustering"
for v in nodes(G):
    print v,degree(G,v),clustering(G,v)

# print the adjacency list to terminal 
write_adjlist(G,sys.stdout)

可视化也是直截了当的:

enter image description here

更多的可视化: http://jonschull.blogspot.com/2008/08/graph-visualization.html

其他提示

虽然这个问题现在是相当老旧的,我认为这是值得提及我自己的蟒蛇模块,用于图操纵叫 图工具.这是非常有效,因为数据结构和算法是用C++实现,用的模板metaprograming,采用提高图表的图书馆。因此,它的性能(在存储器的使用和运行时)相当于一个纯C++库,并且可以量比典型的代码,在不牺牲了便于使用。我使用它自己不断地对工作有很大的图表。

正如已经提到的,NetworkX是非常好,有另一个选择是 igraph.这两个模块将有大多数(如果不是全部)的分析工具你可能需要,而这两个图书馆经常使用与大型网络。

词典还可以包含的开销,取决于实际执行情况。Hashtable通常含有一些黄金可用节点的数量开始,尽管你可能只使用一对夫妇的节点。

看你如,"财产",你会更好的有一个类方法的最终水平和真实性?或是名称的性质改变了很多节点?

我想说的是什么"有效"意味着依赖于大量的事情,如:

  • 速度更新(插入、更新、删除)
  • 速度随机检索的访问
  • 速度顺序检索
  • 使用的存储器

我认为你会找到一个数据结构,该结构是迅速通常会消耗更多的记忆不止一个,是缓慢的。这并不总是这种情况,但大多数数据结构似乎遵循这一点。

字典,可能很容易使用,并给你相对均匀地快速存取,它将最可能使用更多的存储比,作为你的建议,列表。名单,但是,一般倾向于包含更多的开销时数据插入,除非他们预先分配X节点,在这他们会再次使用更多的存储器。

我的建议,在一般情况下,将只是使用的方法,似乎是最自然的给你,然后做一个"压力测试"的系统,增添了大量的数据来看,如果它成为一个问题。

你也可以考虑添加一个层的抽象到你的系统,使你不必改变编程接口,如果你以后需要改变内部数据的结构。

我的理解是,随机访问是在固定的时间为蟒蛇的字典,并列出,不同的是,你只能做随机访问为整索引列表。我假设你需要找一个节点通过其标签,所以,你想要一个词典的字典.

然而,在性能上的面前,载入存储器可能不是一个问题,但是如果使用太多你会最终交换的磁盘,它将杀死的表现甚至蟒蛇的高度有效的字典.尝试保持存储器使用情况下尽可能多的。此外,RAM是令人惊讶的是廉价的现在;如果你做这种事情很多,没有理由不至少有4GB.

如果你想建议保持存储器的使用下,给一些更多的信息,这种信息你正在跟踪每个节点。

使基于类的结构可能会有更多的开销比的字典-基础结构,因为在蟒蛇类实际使用的字典时,他们被实施。

毫无疑问NetworkX是最好的数据结构到现在为图。它涉及与公用事业等辅助功能,数据结构和算法,随机序列的发电机、装饰、Cuthill-麦基订购、管理人员上下文

NetworkX是巨大的,因为它wowrs为图形,有向图,并multigraphs.它可以编写的曲线图有多种方式:邻接关系的列表中,多邻接关系的列表, 边缘列表,GEXF,抵.它的工作与坐,GraphML,式,SparseGraph6等。

它有点方法的实现方式看起来也各radimade算法包括:近似,双边、边界、核心,派系、集群、着色、部件、连接性、周期,向非循环的图表, 距离的措施,主要集、欧拉,同构、链接分析,链接预测的、匹配的最低生成树,富人俱乐部、最短路径,历,树。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top