您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Django + Postgres +大时间系列

Django + Postgres +大时间系列

如果我正确理解您的想法,那么您正在考虑将时间序列存储在Postgresql中,一个时间序列记录存储在一个数据库行中。不要那样做

一方面,这个问题是理论上的。关系数据库(我认为大多数数据库)是基于行独立性的前提,而时间序列的记录是按物理顺序排列的。当然,数据库索引为数据库表提供了一些顺序,但是该顺序是为了加快搜索速度或按字母顺序或其他顺序显示结果。它并不意味着该顺序有任何自然的含义。不管您如何订购它们,每个客户都独立于其他客户,并且每个客户的购买都独立于他的其他购买,即使您可以按时间顺序将它们完全合并以形成客户的购买历史。时间序列记录的相互依赖性要强得多,这使得关系数据库不合适。

实际上,这意味着表及其索引占用的磁盘空间将很大(可能比将时间序列存储在文件中大20倍),并且从数据库中读取时间序列将非常慢,类似于命令比存储在文件中慢得多。它也不会给您任何重要的好处。您可能永远不会进行查询“将值大于X的所有时间序列记录给我”。如果您需要这样的查询,则还需要进行其他分析,而关系数据库尚未设计成执行该分析,因此无论如何您都将整个时间序列读入某个对象。

因此,每个时间序列都应存储为文件。它可能是文件系统上的文件,也可能是数据库中的Blob。尽管我已经实施了后者,但我相信前者更好。在Django中,我会这样写:

class Timeseries(models.model):
    name = models.CharField(max_length=50)
    time_step = models.ForeignKey(...)
    other_Metadata = models.Whatever(...)
    data = models.FileField(...)

使用aFileField将使您的数据库更小,并使创建系统的增量备份更加容易。通过在文件中查找来获取切片也将变得更加容易,这对于blob来说可能是不可能或很难的。

现在,什么样的文件?我建议你看看熊猫。这是一个用于数学分析的python库,它支持时间序列,并且还应该有一种在文件中存储时间序列的方法

我在上面链接到我的图书馆,我不建议您使用它。一方面,它不能满足您的要求(它不能处理超过一分钟的粒度,并且还有其他缺点),另一方面,它已经过时了- 我在熊猫之前写了它,打算转换它将来用大熊猫 熊猫的作者写了一本书“ Python for data analysis”,我发现它是无价的。

还有InfluxDB。从未使用过它,因此我没有意见,但是如果您想知道如何存储时间序列,那绝对是您需要检查的东西。

还有TimescaleDB,扩展到Postgresql

我们再次更改了软件,以使其使用TimescaleDB将数据存储在数据库。我们已经精通Postgresql,并且很容易学习一些TimescaleDB。最重要的具体优势是,我们可以进行查询,例如“在2019年的24小时内查找所有降雨量大于50mm的位置”,这在将数据存储在平面文件中时非常困难。另一个优势是完整性检查- 多年来,由于这里和那里的小错误,我们有一些时间序列重复行。缺点也很明显。它使用10倍以上的磁盘空间。因此,我们可能需要更改Postgresql备份策略。慢一点 检索30万条记录的时间序列可能需要一秒钟的时间。这是瞬间。我们需要实现缓存以检索时间序列,而这在以前是不需要的。

Postgres 2022/1/1 18:46:22 有320人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶