如何在python的内存中保存一个非常大的字典?
Posted
技术标签:
【中文标题】如何在python的内存中保存一个非常大的字典?【英文标题】:How to keep a very large dictionary loaded in memory in python? 【发布时间】:2017-04-08 12:59:27 【问题描述】:我有一个非常大的字典,大小约为 200 GB,我需要经常查询我的算法。为了获得快速的结果,我想把它放在内存中,这是可能的,因为幸运的是我有 500GB 的 RAM。
但是,我的主要问题是我只想在内存中加载一次,然后让其他进程查询同一个字典,而不是每次创建新进程或迭代我的代码时都必须再次加载它。
所以,我想要这样的东西:
脚本 1:
# Load dictionary in memory
def load(data_dir):
dictionary = load_from_dir(data_dir) ...
脚本 2:
# Connect to loaded dictionary (already put in memory by script 1)
def use_dictionary(my_query):
query_loaded_dictionary(my_query)
实现这一目标的最佳方法是什么?我曾考虑过使用 REST API,但我想知道通过 REST 请求是否会降低我首先将字典放入内存所获得的所有速度。
有什么建议吗?
【问题讨论】:
也许使用类似 redis 的东西会有所帮助。 是的,redis 也是个好主意。我想知道是否有办法在 python 中做到这一点。我之前尝试过 mongodb,但是最新的wiredtiger 版本的mongodb,没有预加载内存中所有数据的选项。问题是我没有root密码,所以我不想安装太多软件。不过让我试试 redis。 您是否正在尝试重新发明 NOSQL 数据库?为什么不依赖现有的? 另一种可能性是使用shelve
:docs.python.org/3/library/shelve.html
这主要是因为我已经编写了一个线程安全的代码来快速加载和提供内存中的数据,这比 mongodb 快得多。我只是想知道是否有一种严格的“python”方式来重用我所做的事情,而无需重写代码以移植到新数据库。
【参考方案1】:
要么运行一个单独的服务,您可以使用前面提到的 REST API 访问该服务,要么使用内存数据库。
我个人对Redis 的体验非常好,但还有很多其他的(Memcached 也很受欢迎)。 Redis 很容易与 Python 和 Django 一起使用。
不过,在这两种解决方案中都可以进行数据序列化,因此会降低一些性能。有一种方法可以用简单的结构(例如列表)填充 Redis,但我没有尝试过。我打包了我的数字数组并将它们序列化(使用 numpy),它最终足够快了。如果您仍然使用简单的字符串键值对,那么性能将是最佳的,并且使用 memcached 可能会更好。
【讨论】:
以上是关于如何在python的内存中保存一个非常大的字典?的主要内容,如果未能解决你的问题,请参考以下文章