【问题标题】:Integrating multiple dictionaries in python (big data)在python(大数据)中集成多个字典
【发布时间】:2012-07-09 12:04:01
【问题描述】:

我正在从事一个大数据挖掘的研究项目。我目前已经编写了代码来将我拥有的数据组织到字典中。但是,数据量如此之大,以至于在形成字典时,我的计算机内存不足。我需要定期将我的字典写入主内存并以这种方式创建多个字典。然后我需要比较生成的多个字典,相应地更新键和值,并将整个内容存储在磁盘上的一个大字典中。知道如何在 python 中做到这一点吗?我需要一个可以快速将字典写入磁盘然后比较 2 个字典并更新密钥的 api。我实际上可以编写代码来比较 2 个字典,这不是问题,但我需要这样做而不会耗尽内存..

我的字典看起来像这样: "orange" : ["这是一种水果","很好吃",...]

【问题讨论】:

  • 你能给我们一个你的字典是什么样子的样本吗?你只是在计算单词的出现次数吗?
  • 除了@HughBothwell 提到的 - 数据在组织(到字典中)之前来自哪里?
  • 我有一个庞大的推特推文数据库。请参阅斯坦福 SNAP 推特数据库。
  • 嗯,“SNAP”是一个要求吗?或者您可以使用 MongoDB 之类的东西和 MapReduce 来获得足够的东西来使用图论吗?

标签: python memory data-mining


【解决方案1】:

您应该使用 PostgreSQL 等数据库。

【讨论】:

  • 首先,它将能够处理比您存储在内存中的数据量大得多的数据。您自己创建的任何解决方案都可能只是重新实现数据库的功能,很糟糕。
【解决方案2】:

同意 Hoffman:选择关系数据库。数据处理对于关系引擎来说是一项不寻常的任务,但相信它是在易于使用/部署和大型数据集的速度之间的一个很好的折衷。

我通常使用 Python 自带的 sqlite3,虽然我更经常通过apsw 使用它。像 sqlite3 这样的关系引擎的优势在于,您可以指示它通过连接和更新对您的数据进行大量处理,并且它会以一种非常明智的方式处理所需的所有内存/磁盘交换数据。您还可以使用内存数据库来保存需要与大数据交互的小数据,并通过“ATTACH”语句将它们链接起来。我以这种方式处理了千兆字节。

【讨论】:

  • 谢谢.. 看看数据库!
【解决方案3】:

首先想到 - 切换到 64 位 python 并增加计算机的虚拟内存设置;-)

第二个想法 - 一旦你有一个大字典,你可以按键排序并将其写入文件。写入所有数据后,您就可以同时遍历所有文件,随时比较并写出最终数据。

【讨论】:

    【解决方案4】:

    当您说“主存储器”时,您是指硬盘驱动器吗?计算机中只有一个内存系统。

    您可以使用pickle 模块将 Python 数据对象写入文件。我不确定您是否可以将多个对象腌制到一个文件中,但这应该无关紧要。

    import pickle
    
    def dump_dict(dict, name):
        with open(name, 'wb') as file:
            return pickle.dump(file, dict)
    
    def get_dict(name):
        with open(name, 'rb') as file:
            return pickle.load(file)
    
    def get_key(key, *list_of_dicts):
        """The first argument is the key; any further args are interpreted as the names of
    pickled dict files to check."""
        out = []
        for name in *list_of_dicts:
            with open(name, 'rb') as f:
                out.append(pickle.load(f).get(key)) # Add this dict's value, glossing over KeyErrors.
        return tuple(out)
    

    您当然可以找出其余部分并根据需要扩展功能。

    【讨论】:

    • 您确实可以根据需要将任意数量的对象打包到同一个泡菜文件中。请注意,cPickle 会更快,json 可能会比这更快,如果您的对象足够简单以成为jsoned。
    猜你喜欢
    • 2017-08-15
    • 1970-01-01
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 2021-01-05
    • 2015-10-29
    • 1970-01-01
    相关资源
    最近更新 更多