문제

나는 할 필요가 조작할 수 있 큰(10^7 노드)그래프에서는 파이썬.데이터 해당하는 각 노드/edge,최소한의 말은 수의 문자열입니다.무엇을 가장 효율적인 관점에서의 메모리와 속도, 법은 이것을 하고 있는가?

Dict 의 dicts 더 유연하고 간단하게 구현할 수 있지만,나는 직관적으로 기대 목록의 목록을 빠르게 할 수 있습니다.목록 옵션을 필요로 하는 것입니는 나 유지하는 데이터는 별도의 구조,동 dicts 것을 허용 무언가를 일종의:

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

당신은 무엇을 좋?


예,내가 조금 더 명확한에서 내가 무엇을 의미하여 효율성이다.이 특정한 경우에 저는 그것을 의미하는 측면에서의 랜덤 액세스 검색 등이 있다.

선적 데이터를 메모리지 않는 거대한 문제입니다.그 수행 한다.시간이 많이 소요되는 부분을 방문한 노드는 그래서 내가 정보를 추출할 수 있고 측정하는 메트릭에 관심이 있어요.

고려하지 않았던 만드는 각 노드 클래스(속성이 동일하를 위해 모든 노드)그러나 그것처럼 보인다는 것입 add an extra 층의 오버헤드?내가 누군가를 희망하는 어떤 직접적인 경험으로 비슷한 경우에는 그들이 나눌 기회를 가질 수 있었다.모든 후,그래프는 하나의 가장 일반적인 추상화에 CS.

도움이 되었습니까?

해결책

나는 강하게 옹호를 보 으로 바꾸기.그것의 전투 테스트 전쟁을 말하고 첫 번째 도구 대부분의 연구를'형식에 도달할 때 필요한 분석 네트워크 기반의 데이터입니다.내가 조작 그래프로 100 년의 수천의 가장자리에서 문제 없이 노트입니다.그것의 기능이 풍부하고 사용하기 매우 쉽습니다.당신은 자신을 발견 할 것이 더 초점을 맞추고 손에 문제에 보다는 오히려 상세정보에서 기본 구현합니다.

Erdős-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

다른 팁

도 이 질문은 지금 아주 오래된,나는 생각한 가치가 있다고 언급한 내 자신의 python 모듈에 대한 그래프를 조작이 불 그래프-도구.그것은 매우 효율적이기 때문에,데이터 구조와 알고리즘 구현에서는 C++템플릿 metaprograming 를 사용하여,향상을 그래프 라이브러리입니다.따라서 그것의 성능(모두에서 메모리 사용량 및 런타임)는 비교는 순수한 C++라이브러리,그리고할 수 있습의 주문 크기보다 더 나은 일반적인 python code 을 희생하지 않고,사용의 용이성이다.나는 그것을 자신을 사용에 지속적으로 작동이 매우 큰 그래프.

이미 언급했듯이,으로 바꾸기가 아주 좋은,다른 옵션을 사용되는 igraph.두 모듈이 있을 것이 가장(모든 경우)분석 도구를 가능성이 있어요,그리고 라이브러리를 모두 정기적으로 사용되는 큰 네트워크입니다.

사전 포함할 수도 있습니다 오버헤드에 따라 실제 구현합니다.Hashtable 일반적으로 포함하는 일부 소수의 사용할 수 있는 노드를 시작할 수 있습니다에도 불구하만 몇 가지를 사용하의 노드입니다.

으로 판단하를 들어,"속성",당신의 더 나은 클래스와 방법에 대한 최종 단계와 실제 특성?나가는 이름의 속성을 변경하에서 많은 노드 노드?

내가 말하는데 무엇인"효율적인"방법에 따라 많은 것을,다음과 같:

  • 업데이트 속도(insert,update,delete)
  • 속도 랜덤 액세스 검색
  • 속도 순차적으 검색
  • 메모리 사용되는

나는 생각을 찾을 수 있는 데이터 구조는 빠른 것이 일반적으로 더 많은 메모리를 소비한다는 느립니다.이것은 항상 경우,그러나 대부분의 데이터 구조 보이 이것을 따르십시오.

사전될 수 있을 사용하기 쉽고,당신은 상대적으로 균일하게 빠르게 액세스,그것은 가장 가능성이보다 더 많은 메모리를 사용하여,당신은 제안을 나열합니다.목록은,그러나,일반적으로 포함하는 경향이 있상 오버헤드를 할 때 데이터를 삽입한 경우를 제외하고는 그들을 미리 할당 X,노드는 그들이 다시 더 많은 메모리를 사용.

나의 제안,일반적으로,것을 그냥하는 방법을 사용하는 것이 가장 자연스러운,그리고"스트레스 테스트"시스템의 추가,상당한 양의 데이터를 보면 그것은 문제입니다.

하는 것을 고려해야 할 수 있습니다 추상화 계층 시스템,그래서 당신은 없을 변경하는 프로그래밍 인터페이스는 경우에 당신이 나중에 변경이 필요 내부터 데이터 구조입니다.

내가 알고있는 것처럼,랜덤 액세스는 지속적인 시간 모두에 대한 파이썬의 dicts 고 목록할 수 있다는 점에서 차이가 있습니다만 임의 액세스의 정수 인덱스를 가진 목록입니다.나는 가정해야 하는 조회 노드에 의해 그것의 상표는,그래서 당신이 원하는 dict 의 dicts.

그러나 성능에 앞,로드 메모리로 문제가 될 수 있지 않습,그러나 당신이 너무 많이 사용하면 교환을 디스크에 있는 것입니다 죽일 성능의 심지어는 파이썬은 매우 효율적 dicts.을 유지하려고 메모리 사용량을 아래로 가능합니다.또한,RAM 은 놀라 울 정도로 저렴한 지금;이렇게 하면의 종류는 일이 많은지 않을 이유가 없습니다 적어도 4GB.

고 싶은 경우 다음에 대한 조언을 유지하는 메모리 사용량이 내게 좀 더 많은 정보에 대한 정보의 종류는 당신이에 대한 추적은 각 노드입니다.

를 만드는 등 기반 구조를 가능하게 더 많은 오버헤드보다 dict-기반 구조를,이후에 데이터베이스에 실제로 사용 dicts 때 그들이 구현됩니다.

의심의 여지 없으로 바꾸기 가장 좋은 데이터 구조를 지금까지 그래프.그와 같은 유틸리티는 도우미 기능,데이터 구조와 알고리즘,임의의 순서는 발전기,디자이너,Cuthill-맥키는 주문,상황에 맞는 관리자

으로 바꾸기 때문에 중 wowrs 에 대한 그래프를 겹자 및 multigraphs.그것을 쓸 수 있는 그래프는 여러 가지 방법:인접 목록,여러 인접 목록 리 목록 GEXF,GML.그것은 피클,GraphML,JSON,SparseGraph6etc.

그것은 세계에서 가장 중의 다양한 radimade 알고리즘을 포함하여:근사치,양자,경계선을 중심,벌 클러스터링,착색,구성 요소를 연결,사이클 감독,비순환 방향 그래프 거리 측정을 지배하면서,세트,오일러,동형,링크 분석,링크 예측,일치,Minimum Spanning Tree,풍부한 클럽,가장 짧은 경로,탐색,나무입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top