2012-06-14 26 views
8

Yüzlerce milyon düğüm içeren çok büyük bir NetworkX Graph nesnesiyle uğraşmaya çalışıyorum. Tüm bilgisayar belleğimi tüketmeyecek şekilde dosyaya yazabilmeyi isterdim. Bununla birlikte, sürekli olarak mevcut düğümler arasında arama yapmam gerekiyor, kenarları güncellemek vb.NetworkX Graph Okuma/Yazma Nesnesi

Bunun için iyi bir çözüm var mı? http://networkx.lanl.gov/reference/readwrite.html

'da sağlanan dosya biçimlerinden herhangi birinin nasıl çalıştığını bilmiyorum. Tek bir çözüm, her bir düğümü dosya sistemindeki diğer düğümlere referanslarla ayrı bir dosya olarak saklamaktır. Sınav için bir düğüm açmak, belleği aşırı yüklemez. Kendi boilerplate kodumu yazmadan bunu yapmak için büyük miktarda veri (örneğin PyTables) için mevcut bir dosya sistemi var mı?

cevap

2

, o zaman zaten bellekte olacaktır. Bu büyük bir grafik için tahminim, ayrı dosyalar ile önerdiğiniz şeye benzer bir şey yapmanız gerekecek. Ancak, ayrı dosyaları kullanmak yerine, her düğümün düğümler arasında çoktan çoğa bağlantılarla saklanması için bir veritabanı kullanacağım. Başka bir deyişle, bir düğümler tablosu ve kenar tablosu, sonra belirli bir düğümün komşularını sorgulamak için her iki uçta da o özel düğüme sahip olan herhangi bir kenar için sorgulayabilirsiniz. Bu hızlı olmalı, ağdaki tüm ağı ilk kez oluşturmadan NetworkX'in analiz işlevlerinden yararlanıp yararlanamayacağınızdan emin değilim.

+0

Teşekkürler Luis. Veritabanında saklıyorum, ancak komşuları almak için düğümleri sormak son derece pahalıdır .. Sadece Google'ın sunucularının neye benzediğini hayal edebiliyorum ... – ejang

+0

Eğer grafik zaten RAM'daysa, o zaman neden serileştirmek sorun olur? disk alanı, RAM'den daha ucuzdur) Veya NetworkX'in, gösterimi sıkıştıran ve serileştirme sırasında balonlayacak bir tür içsel yöntemi var mı? Merak ediyorum. – user

+0

Sorunun, bir yapıya kaydetme kadar serileştirmeye odaklanmadığını düşünüyorum. Verimli sorgulamaya izin verecek, yani bir veritabanı için önerim geldiği yer. – LuisZaman

18

İlk önce pickle; keyfi nesneleri serileştirmek için tasarlanmıştır.

bir DiGraph oluşturma ve bir dosyaya seri bir örneği:

import pickle 
import networkx as nx 

dg = nx.DiGraph() 
dg.add_edge('a','b') 
dg.add_edge('a','c') 
pickle.dump(dg, open('/tmp/graph.txt', 'w')) 

bir dosyadan DiGraph yükleme örneği:

import pickle 
import networkx as nx 

dg = pickle.load(open('/tmp/graph.txt')) 
print dg.edges() 

Çıkış:

[('a', 'c'), ('a', 'b')] 

halinde Bu yeterince verimli değil, serileşmek için kendi rutinini yazarım:

  1. kenarlar ve (durumda bir düğüm yok kenarlarına doğrudan yer almaktadır)
  2. düğüm.

Mümkün olduğunda liste kavrayışlarının kullanılması çok daha verimli olabilir (döngüler için standart yerine).

Eğer bu Python içinden bir C++ rutin derim, yeterince verimli değildir: bir NetworkX grafik olarak bu inşa ettiyseniz http://docs.python.org/extending/extending.html

+2

+1 pickle harika bir şey, daha önce hiç duymadım, teşekkürler! – Eduardo

+1

Pickle, nesneler için MASSIVE dosyaları oluşturur ve bu zaten büyük bir ağsa, turşu neredeyse kesinlikle işe yaramaz. Diğer birçok nedenden ötürü müthiş ve az kullanılan bir paket. – LuisZaman

+0

@LuisZaman Ne demek istediğini biliyorum. Bu durumda kenarları ve düğümleri elle tanımladım (açıklandığı gibi). Ama eğer grafik zaten RAM'de ise, turşu çok şişirilmişse, diske sığmayacak olsaydım gerçekten şaşırırdım. – user

İlgili konular