2014-02-06 28 views
0

我的Node.js应用程序需要为几千兆字节的时间戳CSV数据编制索引,以便它可以快速获取任意值组合的行数,无论是每天的每分钟(1440个查询)还是每个小时在几个月内(也是1440年)。我们在半秒钟内说。海量数据快速重复行计数 - 什么格式?

不会读取列值,只有给定排列的每个区间的行数才会被读取。将时间缩短至整个分钟即可。每列的可能值很少,介于2到10之间,有些取决于其他列。进行预处理并将计数存储为适用于此单一任务的任何格式都可以 - ,但是会是什么格式?

存储实际值可能是一个坏主意,数百万行和变化很小。

为每个组合生成短代码并与正则表达式匹配可能是可行的,但由于这些代码必须每分钟重复一次,所以我不确定这是一种好方法。

或者它可以使用像SQLite,NeDB或TingoDB这样的嵌入式数据库,但是我们并不完全相信,因为它们没有原生类枚举类型,可能或不可能用于这种计数。但也许它会工作得很好?

这是一个惯用的解决方案的常见问题,但我还没有弄清楚它可能被称为什么。知道该怎么称呼它以及如何思考它会非常有帮助!

回答

0

现在我会回答自己的发现,但我仍然有兴趣了解更多关于此问题的理论。

NeDB在这里不是一个好的解决方案,因为它将我的值作为正常的JSON保存在引擎盖后面,为每行重复键名并添加唯一ID。它浪费了很多空间,并且肯定会太慢,即使只是因为磁盘I/O。

SQLite可能会更好地压缩和索引数据,但我还没有尝试过。如果我这样做,将更新我的结果。

相反,我采用了我提到的另一种方法:为我们遇到的每个列值分配一个唯一的字母,并得到一个表示排列的短字符串。然后对于每一分钟,将这些字符串作为关键字添加,如果它们发生,则将出现次数作为值。我们稍后可以使用我们的字典来创建一个匹配任何组合的正则表达式,并非常快速地在这个小索引上运行它。

这很容易实现,但是如果我有更多可能的列值比我发现的约70更复杂。