Python 将bson写入磁盘时出现内存不足错误

Python 将bson写入磁盘时出现内存不足错误,python,json,mongodb,bson,Python,Json,Mongodb,Bson,我已经建立了一个庞大的字典,大概有几百GB左右。有没有一个聪明的方法来存储这样的对象。我正在使用以下例程推送到磁盘: print "Writing to file..." jsontext = bson.dumps(sample_dict) f = open(predump_file, 'wb+') f.write(jsontext) f.close() 以下是我得到

我已经建立了一个庞大的字典,大概有几百GB左右。有没有一个聪明的方法来存储这样的对象。我正在使用以下例程推送到磁盘:

print "Writing to file..."
                jsontext = bson.dumps(sample_dict)
                f = open(predump_file, 'wb+')
                f.write(jsontext)
                f.close()
以下是我得到的堆栈跟踪:

Writing to file...
Traceback (most recent call last):
  File "Combine.py", line 1331, in <module>
    jsontext = bson.dumps(sample_dict)
  File "/mnt/opt/Centos5.8/python-2.7.8/lib/python2.7/site-packages/bson/__init__.py", line 69, in dumps
    return encode_document(obj, [], generator_func = generator)
  File "/mnt/opt/Centos5.8/python-2.7.8/lib/python2.7/site-packages/bson/codec.py", line 207, in encode_document
    encode_value(name, value, buf, traversal_stack, generator_func)
  File "/mnt/opt/Centos5.8/python-2.7.8/lib/python2.7/site-packages/bson/codec.py", line 177, in encode_value
    traversal_stack, generator_func))
MemoryError: out of memory
正在写入文件。。。
回溯(最近一次呼叫最后一次):
文件“Combine.py”,第1331行,在
jsontext=bson.dumps(示例)
文件“/mnt/opt/Centos5.8/python-2.7.8/lib/python2.7/site-packages/bson/_-init__;.py”,第69行,转储文件
返回编码\文档(对象,[],生成器\函数=生成器)
文件“/mnt/opt/Centos5.8/python-2.7.8/lib/python2.7/site packages/bson/codec.py”,第207行,在encode_文档中
编码值(名称、值、buf、遍历堆栈、生成器函数)
文件“/mnt/opt/Centos5.8/python-2.7.8/lib/python2.7/site packages/bson/codec.py”,第177行,在encode_值中
遍历(堆栈,生成器(函数))
内存错误:内存不足
选择(我目前只能想到这些):

  • 字典是嵌套的,因此本质上是将字典拆分为多个层
  • 在第一个键上拆分字典,并为这些基础字典提供另一个索引。然后,我可以独立存储N个词典。如果这是好的,是否有任何推荐的方法来拆分其键的字典并生成顶层索引字典。我认为每个子字典都必须是一个变量。一旦我们有了大的嵌套字典,我们可以说把它分成N个小字典,在上面有一个映射索引
  • MongoDB是一个潜在的解决方案吗

  • 我认为这实际上取决于dict的内容以及以后检索数据的方式。如果我是你,我会选择第二种方法。

    对于mongo db,最大(bson)文档大小为16MB。不能存储大小大于该值的数据。 您可以将每个
    键值作为文档存储在集合中。
    
    在您的情况下,您可以使用
    字段作为文档的
    \u id
    属性

    您可以显示一些词典内容吗?嵌套字典的深度是多少?就我个人而言,我会使用一个数据库来完成这项任务,很高兴知道这个限制