大佬们,请教一下数据读取

7 天前
 iamtuzi3333
小弟负责是后端内容的编写,现在系统有一批传感器,数据格式都是 json ,每个传感器每秒都有数据发送过来。我接收,然后写入文件,每天一个.json ,例如:传感器编号-日期-文件,这样的格式。文件中每行都是{}的数据,里面有时间戳,data ,例如{"time":12346574,"data":[1,2,3,4,5]},每一行都是这样的形式。文件夹目录有分层,每天都有一个日期对应的目录,里面就是当天的数据文件。数据同时存入到数据库 Mongo 中,单个节点,建了 time 字段的索引。现在查询历史数据量多的话感觉速度还是有点慢,依靠 time 字段找出时间范围的数据,取出每条数据的 data 元素;现在小弟想数据库只存储当前 3 天的数据,就是额外写一个脚本定时删除三天以前的数据,然后历史数据改为读取对应文件及日期的文件数据,这样读取历史数据是否可行,速度是否更快呢,后端用的 node ,他读取数据量量一大就容易内存栈,这个 data 字段元素有 200 个浮点数,一天能存 86400*200 多个数字,所以读取历史数据有时候读的时间范围大就容易崩,想请教大佬们怎么处理好一点。
1424 次点击
所在节点    程序员
26 条回复
kivmi
7 天前
从大数据处理基本都是 map-reduce ,所以,这么直接查询原始数据,总感觉有些不妥
iamtuzi3333
6 天前
@nivalxer 我是每个传感器一个表,返回的文档长度不超过 16M 吗,有更好的方案可以分享一下。
@hd10180 他格式没有这么多,就是固定的 data 数组,要么 50,100,200 ,是根据采样率来定的。传感器也没有 uuid 全靠自己编。
@yyt6801 data 数组就是 50 或者 100 或者 200 个浮点数,每秒的数据都是这样。
@sagaxu 是的,我现在只统计了每秒的最大值,最小值,平均值,读取起来还不算太费劲。正常来说我们只关注十分钟这个节点,还有每分钟数据,这个都还算好用处理。文件确实,主要是读取文件比较麻烦,文件目录不固定,没有很好的索引方式。
@kivmi 是的,但是我们的数据也不算大,就是多,频繁,每秒都有,直接查询原始数据出来也是为了做进一步处理,比如取出每一分钟的最大值,最小值,均值,方差这一些。
nivalxer
6 天前
我们这边行业比较特殊,对接 PLC 走场站这块,虽然 PLC 站控那边数据是实时的,我们采集远传还是以间隔来走的,所以数据量不会太多,在 10 秒频率下,按天走也不会超过 16M 。这个 16M 是输出文档大小,如果采用分页查询等,输出文档不超过 16M 也没啥问题。
数据库我们暂时还是 mongodb 还没改,计划后面改,还没测试其他方案。
我们行业场景,其实客户不会关注每秒的数据情况,所以大部分时间客户查的小时表(每小时一条取样)和统计表(小时、日、月)这两种,压力就还好。少量在出报警、统计到处等场景才会查完整历史数据。
可以按客户场景来处理。如果客户有每条数据必须存和频繁的查询需求,在不过多改动现有技术架构情况下,可能看看其他数据库比较合适。
fishman231
6 天前
MongoDB 也是有时序集合,可以使用 TTL 索引自动删除过期文件.另外时序集合可压缩数据,这样是否可以所有数据都存数据库呢
pangzipp
6 天前
mongodb 本身有数据压缩
你能够实现 3 天以前数据读本地文件文件, 那也可以在 mongodb 里分表。

可以评估下计划投入的资源,成本多少?
用自己熟悉的技术栈
iamtuzi3333
4 天前
@nivalxer 挺好,后者历史数据我们很像,不过我就是还有一个实时数据的波形展示。
@fishman231 我查询看看。
@pangzipp 目前还没有实现三天以前读取本地文件,就是想这么做,看到一个方案就是只存储最近几天的数据,然后历史数据都存储到文件,查询历史数据通过读文件的形式去完成。MongoDB 分表我还不熟悉;技术栈都是啥好用简单方便就上啥了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1101255

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX