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

2024-04-26 12:41:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有4亿行独特的键值信息,我想在脚本中快速查找。我想知道做这件事的巧妙方法是什么。我确实考虑了以下几点,但不确定是否有一种方法可以对字典进行磁盘映射,并且除了在字典创建期间之外,不需要使用大量内存。

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

如果有什么不清楚的,请告诉我。

谢谢! -阿比


Tags: 对象方法内存脚本信息类型dictionary字典
3条回答

没有人提到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()

我会在任何更奇特的形式之前尝试这个,并且使用shelve/pickle会在加载时将所有内容拉入内存。

干杯

提姆

原则上,shelve模块完全按照您的要求工作。它提供了一个由数据库文件支持的持久字典。键必须是字符串,但shelve将处理pickling/unpickling值。db文件的类型可以有所不同,但它可以是一个Berkeley DB散列,这是一个优秀的轻量级键值数据库。

你的数据量听起来很大,所以你必须做一些测试,但是shelve/BDB很可能可以胜任。

注意:已弃用bsddb模块。以后shelve可能不支持BDB散列。

如果你想保存一个大字典,你基本上是在看一个数据库。

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

相关问题 更多 >