存储科学数据[关闭]
Posted
技术标签:
【中文标题】存储科学数据[关闭]【英文标题】:Storing science data [closed] 【发布时间】:2014-01-11 21:02:15 【问题描述】:每个传感器的分辨率为 10 位,每秒可进行 500 次测量。此外,我们为每次检测存储第一次测量的时间戳(假设我们为此保留 32 位)。
500 次测量 * 10 位 + 32 位 = 每次检测 5032 位
假设每次检测持续 1 秒,每个传感器每小时检测 500 次。这给我们留下了每个传感器每小时大约 307KB 的数据。假设有 10 个传感器,我们每年有 25.7GB 的数据(不考虑我们还应该为每个传感器存储标识符)。
现在,~26GB 并不多,我想简单的 mysql 数据库可以容纳它。问题是稍后的数据将使用一些繁重的算法进行处理,并且来自不同传感器的数据将不断地相互比较。
可以进行的查询示例:
“如果两个时间戳之间的差异小于 0.5 秒,则获取传感器 3 和传感器 4 的所有检测”(即匹配检测) “如果测量值的峰值大于 900,则在 2014 年 3 月 1 日获取所有检测结果” “比较传感器 1 的检测 #3 和传感器 7 的检测 #7”(即根据测量数据而非时间戳判断检测是否匹配)每次检测本质上都是一条曲线。
问题是为数据库选择什么解决方案。关系数据库是否足够好?如果是,哪一项允许列出的操作?如果不是,是 no-sql 方法吗?为什么?
TL;DR:
如何存储大量非常相似的科学数据?我们每年谈论 21900000000 次测量,分为 10 个传感器中的每一个的 4380000 次观测。以后必须可以对观察结果进行复杂的计算和比较。另外,根据解决方案,如何组织数据?
【问题讨论】:
我不建议为此使用传统的关系数据库;它可以处理它,但它可能会变得太贵。使用某种类型的数据库来处理如此大量的流数据。您甚至可能想研究自己的主存储二进制格式。给 linux 服务器足够的内存,它应该都适合内存。 【参考方案1】:我建议研究 hdf5。它非常擅长存储类数组数据;唯一的问题是我上次使用它时,它在开发过程中不是很健壮;如果我的代码因打开的连接而崩溃,它通常会破坏我的整个数据集。不过我相信最新版本解决了这个问题。
【讨论】:
您介意回答最后一个问题吗?在这种情况下,您将如何使用 hdf5 组织数据? 我认为你必须有 2 个数据库:一个用于实时存储(事务处理),第二个用于处理(分析处理)。第一个数据库必须快速存储(不要使用很多索引)。来自第一个数据库的数据将定期传输到第二个数据库。第二个数据库应该有许多索引或/和聚合以快速响应查询。 我会说此类数据的直接组织是为每个传感器创建一个可扩展数组,其中原子(数据类型/行描述符)将是时间戳对象加上 500 个 16 位整数的数组.每秒存储的数据量相当微不足道;并且 hdf5 也使添加适当的压缩变得轻而易举。我不知道您使用哪种语言,但 pytables 是开始探索 hdf5 的好地方。 @EelcoHoogendoorn:我正在使用 Java。因此,您建议将每个观察结果存储为一行,其中包含时间戳数据、传感器 ID 和具有 500 个测量值的数组?我猜每年大约 5000 万行不会减慢 hdf5 的速度? @quet:我认为最重要的是让你的测量代码保持简单,并以一种干净的方式退出它,同时正确关闭数据库连接(即,不要只是杀死进程)。没有写连接的进程不是责任。请参阅此讨论:mail-archive.com/hdf-forum@hdfgroup.org/msg03614.html 用于防止损坏的内部冗余功能计划用于 1.10,但尚未推出。因此,了解这些问题仍然很好。以上是关于存储科学数据[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
将数据帧转换为 numpy 数组会导致所有数字以科学计数法打印 [关闭]