【问题标题】:Alternative to a very large dictionary (~40 million keys)替代非常大的字典(约 4000 万键)
【发布时间】:2018-02-28 22:14:22
【问题描述】:

我有一个相当大的字典,其中包含大约 4000 万个键,我只是通过将 {key: value, key: value, ...} 写入文本文件来天真地存储它们。我没有考虑到我永远无法实际访问这些数据的事实,因为 python 不喜欢将 1.44GB 文本文件作为字典加载和评估。

我知道我可以使用 shelve 之类的东西来访问数据而无需一次读取所有数据,但我不确定如何在不重新生成所有数据的情况下将此文本文件转换为搁置文件数据(我不想这样做)。有没有更好的替代方案来存储、访问以及以后可能更改这么多数据?如果没有,我应该如何将这种怪物转换为搁置可用的格式?

如果重要,字典的格式为{(int, int, int int): [[int, int], Bool]}

【问题讨论】:

  • 使用数据库?
  • 使用 sqlite - Python 在标准库中对它有很好的支持。
  • 添加到 Alexander 的评论中,sqlite3 可能是最低的进入门槛......

标签: python large-files shelve large-data


【解决方案1】:

Redis 是一种内存键值存储,可用于此类问题。

有几个Python clients

hmset 操作允许您插入多个键值。

【讨论】:

【解决方案2】:

https://github.com/dagnelies/pysos

https://github.com/dagnelies/pysos

它像普通的 python dict 一样工作,但它的优点是它比 Windows 上的 shelve 效率更高,并且也是跨平台的,这与 shelve 不同,shelve 的数据存储因操作系统而异。

安装:

pip install pysos

用法:

import pysos
db = pysos.Dict('somefile')
db['hello'] = 'persistence!'

只是给出一个大概的数字,这是一个迷你基准(在我的 Windows 笔记本电脑上):

import pysos
t = time.time()
import time
N = 100 * 1000
db = pysos.Dict("test.db")
for i in range(N):
    db["key_" + str(i)] = {"some": "object_" + str(i)}
db.close()

print('PYSOS time:', time.time() - t)
# => PYSOS time: 3.424309253692627

生成的文件大小约为 3.5 Mb。

因此,在您的情况下,如果插入一百万个键/值对大约需要 1 分钟......您将需要将近一个小时才能将其全部插入。当然,机器的规格会影响很大。这只是一个非常粗略的估计。

【讨论】:

  • 嘿,我知道你的回答差不多是一年前了,但我现在正在尝试使用 Pysos,我想知道如何在插入后获取 Pysos.dict 中键的值它。插入和检索的语法是否相同:db[key]?
  • @AdamLee 完全正确
猜你喜欢
  • 2020-03-11
  • 2011-01-13
  • 2019-04-29
  • 1970-01-01
  • 1970-01-01
  • 2011-07-29
  • 1970-01-01
  • 2019-03-09
  • 2018-01-17
相关资源
最近更新 更多