当前位置: 首页 > 面试题库 >

Django + Postgres +大时间系列

马才
2023-03-14
问题内容

我正在确定一个包含大型,几乎不可压缩的时间序列数据的项目,并想知道带有原始SQL的Django + Postgres是否合适。

我有每小时约2000个对象/小时的时间序列数据。我每年要存储大约200万行,我想1)能够通过连接分割数据以进行分析,2)能够在Django的服务下进行基本的网络概述工作。我认为最好的主意是将Django用于对象本身,但直接使用原始SQL来处理关联的大型时间序列数据。我认为这是一种混合方法。这可能是一个危险信号,但是对一连串的数据样本使用完整的ORM感觉有点过头了。有没有更好的办法?


问题答案:

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

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

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

因此,每个时间序列都应存储为文件。它可能是文件系统上的文件,也可能是数据库中的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”,我发现它是无价的。

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

更新(2020年2月7日): 还有TimescaleDB,扩展到PostgreSQL。

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



 类似资料:
  • 我正在尝试更新我的docker映像从Python:3.8.2-alpine3.10切换到Python:3.9.0-alpine3.12,但在运行django命令ssl_check_private_key:symbol not found时遇到了一个问题。 运行检查时出现以下错误: bash-c“touch/var/donor_reporting_portal/.touch&&django-admi

  • 问题内容: 我在Postgres的平等问题上遇到了麻烦。 平等的工作方式与我期望的一样,如果在对时区进行归一化之后,如果时间相同,那么它应该为真: 但是,似乎不适用于以下情况: 但是,不平等在我期望他们如何实现的过程中起作用: 我有什么误会吗?如何以与平等相同的方式处理时区来评估平等? 问题答案: 以下是两种评估平等的方法: 在 第一个 将它添加到一个。该 第二 通过使用构建体。 但不要使用。曾经

  • 问题内容: 我正在尝试为超过5个小时的旧窗口小部件编写Django查询,但我有点迷失了。窗口小部件模型具有一个用窗口小部件的创建时间填充的。 问题答案: 如果是模型的名称,并且具有名为的DateTimeField属性,则查询为: 请注意,这意味着“创建的内容少于”。

  • 我不太理解时间戳的用法, 例如 用户创建文章,他们可以选择,系统也会自动存储。 a.我是否应该使和具有时区并设置UTC的时间戳? b.用户post字符串,然后将其转换为utc时间戳,如下所示使用并存储,当某人选择这一行时,将其显示为用户客户端时间反向使用 c.我使用到,是不是意味着服务器时间?我做得对吗? 我的想法是,我总是在数据库中插入utc时区时间戳,无论用户/客户端读取的地方,都将数据转换为

  • 问题内容: 是否有可能执行聚合功能的? 假设我们有3个对象 。 第一个目标: 第二个obj: 第3个目标: 这三个对象的结果和汇总将是: 和 我试图聚集和这种方式: 这引起了错误: ProgrammingError:函数min(int8range)不存在第1行:SELECT MIN(“ app_mymodel”。“ price_range”)AS“ price_range__min” FROM“

  • 问题似乎在这个文件中:https://github.com/brianc/node-postgres/blob/master/lib/types/textparsers.js 如果从Postgres返回的日期字符串没有指定时区(例如或),那么它只会构造一个JavaScript日期对象,我相信它只会包括本地时区。