Django+Postgres+大时间序列

2024-10-01 22:40:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究一个包含大量、几乎不可压缩的时间序列数据的项目,并想知道Django+Postgres和raw SQL是否是正确的调用。

我有时间序列数据,每小时大约2K个对象。这是我每年存储的大约200万行,我希望1)能够通过连接分割数据进行分析,2)能够在Django提供的web上进行基本的概述工作。我认为最好的方法是对对象本身使用Django,但是可以使用原始SQL来处理关联的大型时间序列数据。我认为这是一种混合方法;这可能是一个危险的信号,但是对一长串数据样本使用完整的ORM感觉有点过头了。有更好的办法吗?


Tags: 数据项目对象django方法websqlraw
3条回答

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

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

实际上,这意味着表及其索引所占用的磁盘空间将非常大(可能比将时间序列存储在文件中大20倍),从数据库中读取时间序列将非常慢,大约比存储在文件中慢一个数量级。它也不会给你带来任何重要的好处。您可能永远不会执行查询“将值大于X的所有时间序列记录都提供给我”。如果您需要这样一个查询,您还需要一个关系数据库没有设计来执行的地狱般的其他分析,因此您无论如何都会将整个时间序列读入某个对象。

所以每个时间序列都应该作为一个文件存储。它可能是文件系统上的文件,也可能是数据库中的blob。尽管我已经implemented the latter,但我相信前者更好;在Django,我会写这样的东西:

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

使用FileField将使数据库变小,并使系统的增量备份更容易。通过在文件中查找可能不可能或很难获得的片段也会更容易。

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

我把上面的链接到了我的一个图书馆,我不建议你使用;一方面它做不到你想要的(它不能处理超过一分钟的粒度,而且它还有其他缺点),另一方面它已经过时了——我在熊猫之前写的,我打算将来把它转换为使用熊猫。有一本书《数据分析用Python》,作者是pandas,我发现这本书非常有价值。

更新:也有人涌入。从未使用过它,因此我没有意见,但如果你想知道如何存储时间序列,肯定需要检查一下。

听起来你想调查一下timescale。我自己还没有使用过它,但它显然是PostgreSQL的一个扩展,所以我假设完全支持Django,并且它可以像他们说的那样处理

100Ks of rows and millions of metrics per second, even at 100 billion rows on a single node.

时间序列数据库似乎是不断被改造的事物之一,正如上面所建议的,关系数据库并不适合。

我所做的是将Django与InfluxDB相结合,后者是为时间序列数据构建的。使用起来很棒,python客户端库可以使用pandas数据帧。这意味着您可以使用infloxdb查询语言来就地处理数据,或者在python中提取所有数据(聚合的,如果需要的话)进行分析。我的应用程序处理的数据流与您需要的数据流大小相似。

我根据需要将infloxdb系列名称与django app/model/primary key链接起来。时间序列数据进入链接的infloxdb序列,其他缓慢变化或关系数据进入django ORM字段。

相关问题 更多 >

    热门问题