0

我有一堆事件需要首先按位置组织,然后按时间组织,然后是剩余属性(持续时间、成本、描述)的任何组织。问题是有数百万个事件,所以在查询时,我们只需要检索一小部分,它应该是有序的,最好是通过第三个索引(成本或持续时间)。

最终,使用此数据库的应用程序需要超快速地获取数据,并且将执行数千次查询。不幸的是,我们目前绑定到传统的硬盘驱动器,因此数据需要按顺序存储。它不会经常更新(每天几百次写入,而每天读取数百万次)。

我们已经尝试过 MySQL,但即使有索引,定位我们需要的数据部分也需要 200 毫秒,这可能是因为我们的硬盘驱动器必须进行大量搜索,即使它知道所有数据在哪里。

我们已经研究过诸如键值存储(Redis、CouchDB)之类的 NoSQL 解决方案,但 Redis 不进行嵌套,并且 CouchDB 不允许“有序集”,因为它存储在 JSON 中。

有哪些解决方案可以帮助我们根据两个(或更多)指标进行存储?如果它与 Python 有一个很好的界面,那就加分!

4

1 回答 1

2

如果没有对问题更准确的描述,我也无能为力,但我已经使用 KD-Trees 解决了这样的问题,KD-Trees 类似于二叉树,但具有 K 维。它们允许非常快速的 K-最近邻搜索(在我的例子中,我可以在 <1 毫秒内按纬度、经度和时间查询约 1000 万个文档的语料库。)它们唯一真正的缺点是给它们写信很烦人——保持性能,您必须经常重新平衡树。如果您想尝试一下,请查看scipy.spatial.cKDTree模块。假设您已经安装了 scipy,您将在 10 分钟内启动并运行。

如果您正在寻找更多现成的数据库解决方案,我会考虑 PostGIS;它可以让您在 2-4 维上创建空间索引。这将比滚动你自己的 KD 树方法更可靠和(并且更易于编写),但会牺牲一点性能。

编辑:我在这里假设“位置”是指地理位置(纬度,经度)。如果它是像“加利福尼亚”这样的离散位置,那么显然这个答案没有帮助。

于 2013-05-15T02:43:14.767 回答