python - 在 python 中保存大型对象图并附加到它的更有效的方法

标签 python database python-2.7 pickle

我正在爬行 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/

相关文章:

python - 按键分组字典后获取字典列表中最大值的项目

python - 将 sys.stdout.write 与 pool.map 一起用于多处理 - 共享 sys.stdout

python - Python Anaconda Windows 10 的 XGBoost 安装问题(2018 年 5 月 18 日)

python - TweetSentiments.com API Python 脚本

python - 如何创建其中一种类型作为参数提供的类型组合?

mysql - 如何将 form/golang 中的连接池连接到没有数据库的实例?

php - 在同一页面上显示 mysql 结果

database - 使用 sqlite.swift 在数据库中搜索特定行

arrays - 从 numpy 数组计算峰度?

django - 在 Django 1.9 中的应用程序之间导入模型