获取哈希表中所有键小于某个特定值的值的有效方法

3
我们每秒从10个来源收集数据。我正在考虑一种存储数据的内存方式,使我能够获取“从12:01到12:02每个数据点”的数据。
我考虑使用某种树或排序列表。关键是收集时间,值是测量数据的数组。我不知道如何说“给我这个范围内所有键的值”。我只能想到利用这些结构的排序特性快速获取某个键的值。
我需要计算适当的键(12:01:00、12:01:01、...、12:01:59),并独立地提取每个值,还是有什么方法可以利用排序数据结构一次获取所有数据?

RedisVoltDBDaybreak - Mark Thomas
我以为Redis只是一个键/值存储。是否有一些额外的功能来操作这些键呢? - Tyler DeWitt
我不明白。你想要的不就是一个范围查询吗?只要你把数据存储在一个有序数组中,任何排序的数据结构都可以给你这个功能,为什么不能查询出12:01--12:05之间的所有元素呢?但既然你需要频繁插入,我建议你使用B+树。 - Leo
我可能忽略了一些显而易见的东西,但我想不出如何在已排序的数据结构上执行范围查询。虽然可以逐个获取相应的值,但我无法一次性完成。 - Tyler DeWitt
1
是的,Redis更像是一个数据结构服务器。甚至键也可以是数据结构。它支持哈希、列表、集合等等。在你的情况下,你可能想要一个有序集合。你可以执行ZRANGE查询来获取某个范围内键的值。 - Mark Thomas
WTF,忽略我的回答。我以为这是一个Python问题。 - Niklas B.
1个回答

0

使用 Ruby Hash 没有办法做到这一点,而且自己实现也不容易。您需要实现二叉树/B 树/红黑树以及一个良好的 API 来执行范围查询。

我的建议是使用内存中的 SQLite 数据库。然后您可以使用熟悉的 SQL 语法进行查询。SQLite 是一个非常出色的项目,我想它会非常节省空间和时间。

require 'sqlite3'
@db = SQLite3::Database.new ":memory:"
@db.execute <<-SQL
  create table records(
    id integer primary key autoincrement,
    timestamp integer,
    data text
  );
SQL
@db.execute <<-SQL
  select * from records where ...
SQL

在这里阅读有关 SQLite 数据类型的信息:http://www.sqlite.org/datatype3.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接