python - Django + Postgres +大时间系列

标签 python django postgresql heroku bigdata

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

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

最佳答案

如果我正确理解您的想法,那么您正在考虑将时间序列存储在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将使您的数据库更小,并使创建系统的增量备份更加容易。通过在文件中查找来获取 slice 也将变得更加容易,这对于blob来说可能是不可能或很难的。
现在,什么样的文件?我建议你看看 Pandas 。这是一个用于数学分析的python库,它支持时间序列,并且还应该有一种在文件中存储时间序列的方法。
我在上面链接到我的图书馆,我不建议您使用它。一方面,它不能满足您的要求(它不能处理超过一分钟的粒度,并且还有其他缺点),另一方面,它已经过时了-我在 Pandas 之前写了它,打算转换它将来用 Pandas Pandas 的作者写了一本书“Python for data analysis”,我发现它是无价的。
更新(2016):还有InfluxDB。从未使用过它,因此我没有意见,但是如果您想知道如何存储时间序列,那绝对是您需要检查的东西。
更新(2020-02-07):还有TimescaleDB,它是PostgreSQL的扩展。
更新(2020-08-07):我们再次更改了软件,以使其使用TimescaleDB将数据存储在数据库中。我们已经精通PostgreSQL,并且很容易学习一些TimescaleDB。最重要的具体优势是,我们可以进行查询,例如“在2019年的24小时内查找所有降雨量大于50mm的位置”,这在将数据存储在平面文件中时非常困难。另一个优势是完整性检查-多年来,由于这里和那里的小错误,我们有一些时间序列重复行。缺点也很明显。它使用10倍以上的磁盘空间。因此,我们可能需要更改PostgreSQL备份策略。慢一点检索30万条记录的时间序列可能需要一秒钟的时间。这是瞬间。我们需要实现缓存以检索时间序列,而这在以前是不需要的。

关于python - Django + Postgres +大时间系列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25212009/

相关文章:

python - Django 如何循环对象并在模板中显示变量

sql - 使用滞后窗口函数找到正确的分区

python - xlwings 是否仅适用于 Excel 的第一个实例?

python - 无法在 Linux 上用 Python 打开具有完整路径名的文件

python - 在 Python 3 中动态传递函数参数

mysql - 动态表达式 Groovy SQL 的引用

javascript - Javascript 中用于查找参数的正则表达式

Python Win 3.6.0 x64 问题,在 pip3 安装 pyqt5 后缺少 qt designer exe

python - Django 计数 RawQuerySet

python - 如何将python代码导入django中的views.py文件