fra*_*amp 3 compression time-series
我有一个非常大量的数据,格式很糟糕:包含csv文件的16.4GiB zip 文件.每个都csv包含像
TYPE,2014-07-02 04:04:23.806,0.94598,0.94607
Run Code Online (Sandbox Code Playgroud)
基本上:
TYPE(有14种不同类型,未来可以理想地增长)timestamp(以毫秒为单位)TYPE当它们接近时,它们的所有浮点数通常具有非常相似的值总共我有3'091'472'167行,所以我们谈的是数十亿.主要操作将循环部分或全部数据集(为了在数据上运行算法),每月插入一次约2千万条记录(但插入数据不是我想要优化的东西) .
理想的解决方案是将它们存储在一个数据库中,以便我可以轻松地查询它们,但是一些粗略的计算表明我需要46GiB和Postgres(可能会因为一些丑陋的技巧而被降到18GiB).
我已经对我拥有的数据进行了一些实验,我发现:生成包含的gzip文件TIMESTAMP,FLOAT1,FLOAT2会让我~14GiB完全删除时间戳会让我降到~5GiB
节省空间的好方法是以有效的方式存储时间戳.我正在考虑创建一个树结构,其中每个节点都包含一个时间戳数字,其中叶子包含最后一个数字和两个浮点数.
我已经尝试过像druid.io这样的解决方案,但看起来他们正试图优化我的用例不需要的其他东西.
是否有一些我缺少的工具,它正是我想要的?如果没有,什么是存储时间序列数据的有效方法?
谢谢
在PostgreSQL方面,您还可以使用开源列式存储.这可以免费获得压缩,柱状布局和跳过索引.存储和磁盘I/O相关的好处是:
有关详细信息,请访问:https://news.ycombinator.com/item?id = 7523950
如果您还需要将查询扩展到多个CPU核心/机器,则可以使用可扩展的PostgreSQL:http://www.citusdata.com/downloads
除了压缩和高效的数据布局之外,您还可以免费获得PostgreSQL的类型检查,数据操作功能及其所有查询功能.
我会:
将数据分解为数千个片段,并按时间分组。我不知道时间的分布,但也许每小时一个文件。
按时间戳将它们存储在子目录中。例如2014/07/02/04。
将开始时间戳放入文件名中。例如2014-07-02 04:04:23.806.gz。
对于所有行,将类型存储为第一个字节中的索引。这允许扩展到 256 种类型。如果这还不够,请将其设为两个字节。
对于所有行,时间戳是一个两字节整数,浮点数是有符号的 n 字节整数,足以容纳值乘以 10 5。我假设这些浮点值的范围有限。每个四个字节可能就足够了。
对于第一行,时间戳为零,表示该行的时间与文件名的差异。
对于第一行,浮点值是实际值。
对于所有后续行,时间和浮点值是与前一行的差异。请注意,它们可以是负数。
交错值的最高有效字节以最大化小增量的零游程。
使用zlib压缩每个文件。除了默认模式之外,还可以尝试Z_FILTERED和Z_HUFFMAN模式来查看压缩效果是更好还是更差。