Javascript 如何压缩大量数据以节省数据库空间和计算能力

Javascript 如何压缩大量数据以节省数据库空间和计算能力,javascript,database,Javascript,Database,我有一个设备,它的唯一任务是每秒从多个传感器读取数据。每小时(或除非发出拉取请求),它必须将收集的数据推送到数据库。这样做30天会使数据非常大。我想先压缩数据,然后再通过网络将其发送到数据库(另一台机器上),因为数据库的空间和计算时间是宝贵的资源 数据将与此非常接近 TimeStamp | Sensor1 | Sensor2 | Sensor3 | Sensor4 | . . . . . | Sensor64 00:00:01 | 1 | 0 | 0 |

我有一个设备,它的唯一任务是每秒从多个传感器读取数据。每小时(或除非发出拉取请求),它必须将收集的数据推送到数据库。这样做30天会使数据非常大。我想先压缩数据,然后再通过网络将其发送到数据库(另一台机器上),因为数据库的空间和计算时间是宝贵的资源

数据将与此非常接近

TimeStamp | Sensor1 | Sensor2 | Sensor3 | Sensor4 | . . . . . | Sensor64
 00:00:01 |    1    |    0    |    0    |    0    |           |    3
 00:00:02 |    1    |    8    |    0    |    0    |           |    3
 00:00:03 |    1    |    8    |    0    |    0    |           |    3
 00:00:04 |    1    |    2    |    0    |    0    |           |    3
 00:00:05 |    0    |    8    |    0    |    0    |           |    3
 00:00:06 |    0    |    8    |    0    |    0    |           |    3
 00:00:07 |    0    |    0    |    0    |    0    |           |    3
 00:00:08 |    0    |    0    |    0    |    0    |           |    3
 00:00:09 |    0    |    0    |    0    |    0    |           |    3
 00:00:10 |    1    |    2    |    0    |    0    |           |    3
肯定会有一段时间,数据会重复(T.S 7-9和2-3),并且希望知道一种压缩该部分的方法,以便数据库存储,当网页/应用程序提取数据时,网页/应用程序将解压数据,并将其输出给用户

计划使用的数据库是monggoDB(但开放使用其他数据库)

我想到的是删除重复的项,当前端看到丢失的时间戳时,可以理解为丢失的时间戳之前的项已经重复

TimeStamp | Sensor1 | Sensor2 | Sensor3 | Sensor4 | . . . . . | Sensor64
 00:00:01 |    1    |    0    |    0    |    0    |           |    3
 00:00:02 |    1    |    8    |    0    |    0    |           |    3

 00:00:04 |    1    |    2    |    0    |    0    |           |    3
 00:00:05 |    0    |    8    |    0    |    0    |           |    3

 00:00:07 |    0    |    0    |    0    |    0    |           |    3



 00:00:10 |    1    |    2    |    0    |    0    |           |    3
但这种解决方案并不可靠,如果有大量重复数据,它会更有效

是否有一种方法可以以某种方式获取原始数据,并在位级别对其进行压缩,类似于zip/rar的工作方式,前端也可以对其进行解压缩

仅仅是原始计算,每个传感器都会输出一个16位整数

16 bit integer x 64 sensors x 2 628 000 seconds in a month = 2 691 072 000‬ bits / 2.69 GB

一次拉取2.9GB是非常大的

除非您使用的是一个非常专业的数据库(即不是您所指的MongoDB),否则您将无法达到最初的存储密度。您可以将其写入流,通过使用Gzip之类的工具在途中压缩流真正的问题是您需要对数据做什么?如果您真的需要从所有传感器获得逐秒的值,那么除了发送和存储所有内容之外,您没有什么可以做的。然而,如果您所需要的只是,比如,min/max/average per minute,那么有些数据库就是为这样的聚合而设计的。我在存储点火传感器数据时也处理过类似的问题。在我的例子中,没有必要保留每个传感器的值。在某些情况下,平均每分钟就足够了。在其他情况下,我只需要知道传感器值何时变化。您选择什么取决于您需要如何使用数据。(除我提到的两个选项外,还有其他选项)不幸的是,我需要传感器的逐秒数据,因为它将用于稍后重新创建数据,我真正试图避免的是,当您与服务器不在同一网络上时,大量数据被拉取、加载2GB只需要时间