2013-06-20 2 views
2

Я обскакиваю базу данных исследовательских работ и сталкиваюсь с проблемой, поскольку количество узлов становится слишком большим. Вот как работает моя структура данных:Более эффективные способы сохранения графа больших объектов и добавления к нему в python

class Network(object): 
    def __init__(self): 
     self.__authors = {} #each key is a name and each value is an object 
     self.__papers = {} #each key is a pubmed ID and each value is an object 

class Author(): 
    def __init__(self, name = '',paperIDs = []): 
     self.__name = name 
     self.__paperIDs = set(paperIDs) 
     self.coAuthors = {} #dict with author names as key and number of times authors worked together as value 

class Paper(): 
    def __init__(self, title = '', pageID = '', abstract = '', date = '', keywords = [], citedByIDs = [], authorNames = []): 
     self.__title = title 
     self.__pageID = pageID 
     self.__abstract = abstract 
     self.__date = date 
     self.__keywords = keywords 
     self.__citedByIDs = citedByIDs 
     self.__authorNames = authorNames 

     #these lists get arranged by importance based on networkx.pagerank 
     self.__citedBy = [] #IDs 
     self.__doesCite = [] #IDs 
     self.__authors = [] #Objects 

В настоящее время я солить всю сеть, передавая сеть в качестве объекта:

def saveGraph(self,obj,filename): 
    with open(filename,'w') as outf: 
     pickle.dump(obj,outf) 

Теперь проблема заключается в файл рассол становится очень большим. Из этого следует, что сохранение и загрузка занимает очень много времени, кроме того, когда он становится слишком большим, скажем, 20 гб, он не сможет загрузиться в память.

Моя первая и самая важная проблема - сканирование для получения дополнительных данных. Я ползаю, собирая бумаги, которые цитируют каждый лист, и собираю бумаги каждого автора. Этот метод требует, чтобы я проверял, существует ли в dict файл, и добавляет ли ссылка ссылку, иначе создайте новую бумагу. Я также хочу, чтобы несколько копировать, выполняя сканирование, но сохраняя файл рассола настолько большой, что он занимает слишком много времени.

Есть ли другой способ хранения данных; более эффективный способ рассортировать мои объекты; возможно, просто обновить мою базу данных для всех измененных файлов, а не создавать новый маринованный при каждом сохранении; и возможно ли только загрузить часть объектов в мою память?

ответ

2

Я бы предложил написать инструмент для накачки данных в базу данных графа.

Существует язык называется Gremlin, что позволяет делать обходы и поиск по графику, независимо от технологии хранения данных.

https://github.com/thinkaurelius/titan/wiki/Gremlin-Query-Language

Если вам нужен дешевый сервер на практику, я бы рекомендовал розжиг экземпляр в EC2 Amazon. Вы можете запустить сервер, выполнить свою работу, затем закрыть его, чтобы снизить затраты.

+0

Спасибо, neo4j кажется правильным инструментом. –