【发布时间】:2014-09-23 00:53:54
【问题描述】:
我手头有大约 4400 万个键值对需要存储在我的笔记本电脑中。键和值都是短文本,键都是唯一的。它们的总大小约为几千兆字节。
我尝试将它们存储在 GDBM 数据库中。问题是每当我插入一条新记录时,GDBM 都会检查密钥的存在,并且随着数据库的增长它变得越来越慢。我的存储程序运行了 2 个小时,没有很快完成的迹象,所以我放弃了。
所以现在我正在寻找一个键值数据库系统,
- 添加记录时相当快,最好与数据库大小无关。
- 最好是简单和小,这样我就不必在我的笔记本电脑上运行大量的守护进程(最好没有守护进程)。我不需要经常访问这个数据库。
- 访问方便快捷。至少我不需要将整个数据库加载到内存中。我曾考虑将它们存储在一个大的 XML/JSON 文件中,但加载它并访问条目会很痛苦(……对吗?)。
- 理想情况下将所有内容存储在一个文件中。
- 最好有 Python 接口。虽然我不介意写 C/C++。
我不需要经常访问数据库(可能是每周或每月,那种频率)。它只是供我个人使用,因此不需要涉及主从/并发/负载平衡魔术。我可能需要不时查找一些条目,或者有时对整个集合进行一次或两次迭代以获得一些统计信息。一旦最初存储数据,我通常不会(也许永远不会)更改数据。
如果有帮助,我正在使用 2011 Macbook Pro(无 SSD)和 OS X。
我应该使用什么数据库?
更新:我一直在测试一些键值对数据库,包括 Google 的 leveldb。
…
…
…
然后我将我的 OS X 10.10 的公开测试版(我用于所有这些)更新到发布版本,问题消失了…………实际上,DBM 现在都很快了。
【问题讨论】:
-
试用 redis,redis.io。但是,您并没有非常深入地告诉我们您如何访问您的数据,如果是手动访问,还是使用脚本或软件或其他方式,因此其他解决方案可能会更好。此外,您可以仅在需要访问数据时启动您的 redis 守护程序,没有理由让它始终运行(您使用的是 windows 吗?)。
-
嘿@faboolous,感谢您的评论。我正在为我的问题添加更多信息。我知道 Redis。我只是觉得这样一个简单的问题有点矫枉过正。但也许最后我将不得不使用它。它是否支持将数据存储在单个文件中?
-
redis 擅长作为键值存储 - 这实际上是您正在寻找的......但实际上它可能对您的需求有点过分。似乎有一个仅附加文件选项,但我不确定这是您需要的
-
@faboolous,似乎 append-only-file 是一种防止突然终止导致数据丢失的策略……所以对我来说可能没用……
-
Chronicle Map 会做你想做的事,它可以在 Macbook(带 SSD)上每秒进行多达 1000 万次更新/插入/删除,没有守护进程,它只加载你需要的内容进入内存,使用一个文件,但它仅适用于 JVM。你会考虑 Jython 吗?