Django + Postgres +大型时间序列

Ben*_*Ben 11 python django postgresql heroku bigdata

我正在寻找一个包含大量,大部分不可压缩的时间序列数据的项目,并想知道带有原始SQL的Django + Postgres是否是正确的调用.

我有时间序列数据,每小时约2K对象/小时.这是我每年存储的大约200万行,我想1)能够通过连接切片数据进行分析,2)能够在网上进行基本的概述工作,由Django提供服务.我认为最好的想法是将Django用于对象本身,但是使用原始SQL来处理与之关联的大型时间序列数据.我认为这是一种混合方式; 这可能是一个红旗,但使用完整的ORM进行一系列的数据样本感觉就像是过度杀伤.有没有更好的办法?

Ant*_*des 18

如果我理解你的想法,你正在考虑将时间序列存储在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(...)
Run Code Online (Sandbox Code Playgroud)

使用a FileField将使您的数据库更小,并使您可以更轻松地对系统进行增量备份.通过在文件中搜索来获取切片也会更容易,这可能是一个blob可能不可能或困难的事情.

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

我上面链接到我的图书馆,我建议你不要使用它; 一方面它没有做你想要的(它不能处理比​​一分钟更精细的粒度,它有其他缺点),另一方面它已经过时了 - 我在熊猫之前写了它,我打算转换它将来使用熊猫.大熊猫的作者有一本书"用于数据分析的Python",我发现它很有价值.

更新:还有InfluxDB.从来没有使用它,因此我没有意见,但如果你想知道如何存储时间序列,你肯定需要检查它.


小智 9

时间序列数据库似乎是不断重新发明的事情之一,如上所述,关系数据库并不适合.

我所做的是将Django与InfluxDB相结合,后者是为时间序列数据而构建的.这很棒,使用python客户端库可以使用pandas数据帧.这意味着您既可以使用InfluxDB查询语言就地使用数据,也可以将所有数据(聚合,如果需要)用于python中的分析.我的应用程序正在处理与您需要的数量相似的数据流.

我根据需要将InfluxDB系列名称与django app/model/primary key相关联.时间序列数据在关联的InfluxDB系列中,杂项缓慢变化或关系数据进入django ORM字段.


nut*_*uts 5

听起来您想查看timescale。我自己还没有使用过它,但它显然是 PostgreSQL 的扩展,所以我假设完全支持 Django 并且它按照他们说的进行处理

每秒 10 万行和数百万个指标,即使在单个节点上也有 1000 亿行。