*具有持久性存储的大型*python字典,可快速查找

Abh*_*bhi 22 python persistence object-persistence

我有4亿行独特的键值信息,我希望能够在脚本中快速查找.我想知道这样做的方式是什么.我确实考虑了以下但不确定是否有一种磁盘映射字典的方法,并且除了在字典创建期间没有使用大量内存.

  1. 腌制字典对象:不确定这是否是我的问题的最佳解决方案
  2. NoSQL类型dbases:理想情况下需要对第三方内容具有最小依赖性的东西加上键值只是数字.如果你觉得这仍然是最好的选择,我也想听听.可能它会说服我.

如果有任何不清楚的地方,请告诉我.

谢谢!-Abhi

Sam*_*ann 17

如果要保留大型字典,则基本上是在查看数据库.

Python内置了对sqlite3的支持,它为您提供了一个由磁盘上的文件支持的简单数据库解决方案.

  • sqlitedict 包在 sqlite3 之上分层了一个 dict 接口,用于简单的键/值存储。 (2认同)

mha*_*wke 12

原则上,搁架模块完全符合您的要求.它提供了由数据库文件支持的持久字典.键必须是字符串,但搁置将处理酸洗/去除值.db文件的类型可以有所不同,但它可以是Berkeley DB哈希,这是一个非常轻量级的键值数据库.

您的数据大小听起来很大,因此您必须进行一些测试,但搁置/ BDB可能取决于它.

注意:不推荐使用bsddb模块.可能搁置将来不会支持BDB哈希.


Tim*_*man 10

没人提到dbm.它像文件一样打开,表现得像字典,属于标准发行版.

来自文档http://docs.python.org/release/3.0.1/library/dbm.html

import dbm

# Open database, creating it if necessary.
db = dbm.open('cache', 'c')

# Record some values
db[b'hello'] = b'there'
db['www.python.org'] = 'Python Website'
db['www.cnn.com'] = 'Cable News Network'

# Note that the keys are considered bytes now.
assert db[b'www.python.org'] == b'Python Website'
# Notice how the value is now in bytes.
assert db['www.cnn.com'] == b'Cable News Network'

# Loop through contents.  Other dictionary methods
# such as .keys(), .values() also work.
for k, v in db.iteritems():
print(k, '\t', v)

# Storing a non-string key or value will raise an exception (most
# likely a TypeError).
db['www.yahoo.com'] = 4

# Close when done.
db.close()
Run Code Online (Sandbox Code Playgroud)

我会在任何更奇特的形式之前尝试这个,并且使用搁架/泡菜将在装载时将所有内容拉入内存.

干杯

蒂姆

  • 在早期版本的 Python 中,这是 `anydbm` 模块。 (2认同)

sbe*_*rry 6

毫无疑问(在我看来),如果你想要坚持下去,那么Redis是一个很好的选择.

  1. 安装redis-server
  2. 启动redis服务器
  3. 安装redis python pacakge(pip install redis)
  4. 利润.

import redis

ds = redis.Redis(host="localhost", port=6379)

with open("your_text_file.txt") as fh:
    for line in fh:
        line = line.strip()
        k, _, v = line.partition("=")
        ds.set(k, v)
Run Code Online (Sandbox Code Playgroud)

上面假设一个值为的文件:

key1=value1
key2=value2
etc=etc
Run Code Online (Sandbox Code Playgroud)

根据需要修改插入脚本.


import redis
ds = redis.Redis(host="localhost", port=6379)

# Do your code that needs to do look ups of keys:
for mykey in special_key_list:
    val = ds.get(mykey)
Run Code Online (Sandbox Code Playgroud)

为什么我喜欢Redis.

  1. 可配置的持久性选项
  2. 非常快
  3. 提供的不仅仅是键/值对(其他数据类型)
  4. @antrirez