我正在爬行 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
目前,我通过传递 Network 作为对象来pickle整个网络:
def saveGraph(self,obj,filename):
with open(filename,'w') as outf:
pickle.dump(obj,outf)
现在的问题是 pickle 文件变得非常大。因此,保存和加载它需要很长的时间,而且当它变得太大时,比如20GB,它将无法加载到内存中。
我的第一个也是最重要的问题是抓取更多数据。我通过收集引用每一页的论文以及收集每个作者的论文来爬行。此方法要求我检查字典中是否已存在论文以及是否添加引用链接,否则创建一篇新论文。我还想在爬行时频繁备份,但保存这么大的 pickle 文件需要太长时间。
是否有其他方式存储数据;一种更有效的方式来 pickle 我的元素;也许是一种只更新所有已更改文件的数据库的方法,而不是每次保存时都创建一个新的pickle;是否可以只将部分对象加载到我的内存中?
最佳答案
我建议编写一个工具将数据输入图形数据库。
有一种名为 Gremlin 的语言,无论存储技术如何,它都允许您对图进行遍历和搜索。
https://github.com/thinkaurelius/titan/wiki/Gremlin-Query-Language
如果您需要一台便宜的服务器来练习,我建议您在 Amazon 的 EC2 中启动一个实例。您可以启动服务器,完成工作,然后关闭它以降低成本。
关于python - 在 python 中保存大型对象图并附加到它的更有效的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17224183/