我正在抓取研究论文的pubmeds数据库,并且因为我的节点数量太大而遇到问题。以下是我的数据结构的工作原理:
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)
现在问题是pickle文件变得非常大。因此,保存和加载它需要很长时间,另外当它变得太大时,例如20gb,它将无法加载到内存中。
我的第一个也是最重要的问题是抓取更多数据。我通过收集引用每片叶子的论文并通过收集每位作者的论文来爬行。此方法要求我检查dict中是否已存在纸张,是否添加引文链接,否则创建新纸张。我还希望在爬行时稍微备份,但保存一个如此大的pickle文件需要太长时间。
是否有另一种存储数据的方法;一种更有效的方法来腌制我的物体;也许只是为所有已更改的文件更新我的数据库的方法,而不是每次保存时都会创建一个新的pickle;是否只能将一部分物体装入我的记忆中?
答案 0 :(得分:2)
我建议编写一个工具将数据泵入图形数据库。
有一种名为Gremlin的语言允许您在图形上进行遍历和搜索,而不管存储技术如何。
https://github.com/thinkaurelius/titan/wiki/Gremlin-Query-Language
如果你需要一台便宜的服务器来练习,我建议在亚马逊的EC2中启动一个实例。您可以启动服务器,完成工作,然后将其关闭以降低成本。