在大量数据中快速重复行计数 - 什么格式?

时间:2014-02-06 07:52:19

标签: node.js algorithm csv

我的Node.js应用程序需要索引几千兆字节的带时间戳的CSV数据,这样它可以快速获取任意值组合的行数,无论是一天中的每分钟(1440个查询)还是每个几个月(也是1440年)的小时。让我们说半秒钟。

不会读取列值,只读取给定排列的每个时间间隔的行数。将时间缩短到整分钟就可以了。每列的可能值相当少,介于2和10之间,有些值依赖于其他列。可以进行预处理并以适合这个单一任务的任何格式存储计数 - 但这样的格式是什么?

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

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

或者它可以使用像SQLite,NeDB或TingoDB这样的嵌入式数据库,但并不完全相信,因为它们没有类似本地枚举的类型,可能会或可能不会用于此类计数。但也许它可以正常工作?

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

这很容易实现,但如果我的列值超过我发现的70左右,那当然会变得更加棘手。