哪个数据库存储非常大的嵌套Python dicts?

时间:2015-12-27 18:37:18

标签: python database python-2.7 dictionary

我的脚本以下列格式生成数据:

dictionary = {
 (.. 42 values: None, 1 or 2 ..): {
  0: 0.4356, # ints as keys, floats as values
  1: 0.2355,
  2: 0.4352,
  ...
  6: 0.6794
 },
 ...
}

其中:

  • (.. 42 values: None, 1 or 2 ..)是游戏状态
  • inner dict存储在该状态下可能的操作的计算值

问题是状态空间非常大(数百万个州),因此整个数据结构无法存储在内存中。这就是我正在寻找适合我需求的数据库引擎的原因,我可以使用Python。我需要在给定状态下获取动作及其值的列表(之前提到的42个值的元组)并修改给定状态下给定动作的值。

4 个答案:

答案 0 :(得分:1)

您可以使用键值缓存解决方案。一个好的是Redis。它非常快速和简单,写在C上,而不仅仅是一个键值缓存。与python集成只需几行代码。对于真正的big data,redis也可以很容易地缩放。我在游戏行业工作,理解我在说什么。

另外,正如这里已经提到的,你可以使用更复杂的解决方案,而不是缓存,数据库PostgresSQL。现在它支持JSON二进制格式字段 - JSONB。我认为最好的python数据库ORM是SQLAlchemy。它支持开箱即用的PostgresSQL。我将在我的代码块中使用这个。例如,你有一个表

class MobTable(db.Model):
    tablename = 'mobs'

    id = db.Column(db.Integer, primary_key=True)
    stats = db.Column(JSONB, index=True, default={})

如果你的暴徒有这样的json统计数据

{
    id: 1,
    title: 'UglyOrk',
    resists: {cold: 13}
}

您可以使用非零冷抗性

搜索所有怪物
expr = MobTable.stats[("resists", "cold")]
q = (session.query(MobTable.id, expr.label("cold_protected"))
    .filter(expr != None)
    .all()) 

答案 1 :(得分:1)

查看ZODB:http://www.zodb.org/en/latest/

它是Python的natve对象DB,支持事务,缓存,可插入层,打包操作(用于保存历史记录)和BLOB。

答案 2 :(得分:1)

我建议您使用 HD5f 。它是一种与Python完美协作的数据库格式(专门为Python开发),并以二进制格式存储数据。这大大减少了要存储的数据的大小!更重要的是,它为您提供了随机访问的能力,我认为这是出于您的目的。此外,如果您不使用任何压缩方法,您将以尽可能高的速度检索数据。

答案 3 :(得分:0)

您也可以将其存储为JSONB in PostgreSQL DB

要与PostgreSQL连接,您可以使用符合psycopg2Python Database API Specification v2.0