我正在抓取研究论文的 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 作为对象来腌制整个网络:
def saveGraph(self,obj,filename):
with open(filename,'w') as outf:
pickle.dump(obj,outf)
现在的问题是泡菜文件变得非常大。随之而来的是保存和加载它需要很长时间,另外由于它变得太大,比如 20gb,它将无法加载到内存中。
我的第一个也是最重要的问题是爬取更多数据。我通过收集引用每一页的论文和收集每个作者的论文来爬行。这种方法需要我检查 dict 中是否已经存在论文以及是否添加了引用链接,否则创建新论文。我还想在爬网时经常备份,但保存这么大的泡菜文件需要太长时间。
是否有另一种存储数据的方法?一种更有效的腌制对象的方法;也许是一种只为所有更改的文件更新我的数据库的方法,而不是每次保存时都制作一个新的泡菜;是否只能将部分对象加载到我的内存中?