我有一堆事件,我需要首先按位置,然后按时间组织,然后是剩余属性的任何组织(持续时间,成本,描述)。问题是有数百万个事件,因此在查询时,我们只需要检索一个小部分,它应该是有序的,最好是第三个索引(成本或持续时间)。
最终,使用此数据库的应用程序需要以超快的速度获取数据,并且将进行数千次查询。不幸的是,我们目前已经绑定了传统硬盘,因此需要按顺序存储数据。它不会经常更新(每天几百次写入,而每天数百万次读取)。
我们已经尝试过MySQL,但即使有了标记,找到我们需要的数据部分需要200ms,这可能是因为我们的硬盘必须进行大量搜索,即使它知道所有数据的位置。 / p>
我们已经研究过NoSQL解决方案,比如键值存储(Redis,CouchDB),但是Redis没有嵌套,而CouchDB不允许'有序集',因为它存储在JSON中。
有哪些解决方案可以帮助我们根据两个(或更多)指标进行存储?如果它与Python有一个很好的接口,那么奖励积分!
答案 0 :(得分:2)
如果没有对问题进行更准确的描述,我无法提供太多帮助,但我已经使用KD-Trees解决了这样的问题,这些问题就像二维树一样但在K维度上。它们允许真正快速K-最近邻搜索(在我的情况下,我可以通过纬度,经度和时间在<1毫秒内查询约1000万个文档的语料库。)它们唯一真正的缺点是写给他们很烦人 - 为了保持性能,你必须经常重新平衡树。如果您想尝试一下,请查看scipy.spatial.cKDTree模块。假设你已经安装了scipy,你将在10分钟内启动并运行。
如果您正在寻找更多现成的数据库解决方案,我会考虑PostGIS;它将允许您在2-4维度上创建空间索引。与单独使用自己的KD树方法相比,这将更加可靠(并且更易于编写),但会牺牲一些性能。
编辑:我在这里假设通过&#34; location&#34;你的意思是地理位置(纬度,经度)。如果它是一个离散的位置,例如&#34; California&#34;那么这个答案显然没有帮助。