2

我正在抓取研究论文的 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 中是否已经存在论文以及是否添加了引用链接,否则创建新论文。我还想在爬网时经常备份,但保存这么大的泡菜文件需要太长时间。

是否有另一种存储数据的方法?一种更有效的腌制对象的方法;也许是一种只为所有更改的文件更新我的数据库的方法,而不是每次保存时都制作一个新的泡菜;是否只能将部分对象加载到我的内存中?

4

1 回答 1

2

我建议编写一个工具将您的数据泵入图形数据库。

有一种称为 Gremlin 的语言,它允许您在图形上进行遍历和搜索,而不管存储技术如何。

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

如果您需要一个便宜的服务器来练习,我建议您在 Amazon 的 EC2 中启动一个实例。您可以启动服务器,完成您的工作,然后将其关闭以降低成本。

于 2013-06-20T23:28:35.903 回答