【发布时间】:2020-01-07 10:35:16
【问题描述】:
我正在开发一个 Django 应用程序。用例场景是这样的:
50 个用户,每个用户最多可以存储 300 个时间序列,每个时间序列大约有 7000 行。
每个用户都可以随时要求检索他们所有的 300 个时间序列,并要求为每个用户对最后 N 行执行一些高级数据分析。数据分析不能在 SQL 中完成,而是在 Pandas 中完成,它不需要太多时间......但是在单独的数据帧中检索 300,000 行!
用户还可以询问可以在 SQL 中执行的一些分析的结果(如聚合+按日期求和),而且速度要快得多(如果这就是全部,我就不会写这篇文章了) .
浏览和思考,我发现在 SQL 中存储时间序列并不是一个好的解决方案(阅读 here)。
理想的部署架构如下所示(每个存储桶都是一个单独的服务器!):
问题:SQL 中的时间序列太慢,无法在多用户应用中检索。
研究解决方案(来自this article):
这里有一些问题:
1) 虽然这些解决方案在将数百万行时间序列拉入单个数据帧时速度要快得多,但我可能需要将大约 500.000 行数据拉入 300 个不同的数据帧。还会这么快吗?
这是我正在使用的当前数据库结构:
class TimeSerie(models.Model):
...
class TimeSerieRow(models.Model):
date = models.DateField()
timeserie = models.ForeignKey(timeserie)
number = ...
another_number = ...
这是我的应用程序的瓶颈:
for t in TimeSerie.objects.filter(user=user):
q = TimeSerieRow.objects.filter(timeserie=t).orderby("date")
q = q.filter( ... time filters ...)
df = pd.DataFrame(q.values())
# ... analysis on df
2) 即使 PyStore 或 Arctic 可以更快地做到这一点,这也意味着我将失去将我的数据库与 Django 实例分离的能力,更有效地使用一台机器的资源,但只能使用一台机器并且不可扩展(或使用与机器一样多的独立数据库)。 PyStore/Arctic 能否避免这种情况并为远程存储提供适配器?
有没有可以解决这个问题的 Python/Linux 解决方案?我可以使用哪种架构来克服它?我应该放弃我的应用程序的可扩展性和/或接受每 N 个新用户我必须生成一个单独的数据库吗?
【问题讨论】:
-
如果你使用Arctic或PyStore,为什么不能解耦你的“db”?两者都是存储,它们可以在与 Django 应用程序不同的实例上运行。我认为您引用的文章是您问题的最佳答案。您应该尝试一下,看看哪一种最适合您的要求。
-
是的,它们可以在单独的实例上运行,但我将如何在两者之间传输数据?我必须在它们之间写一个层,而且它在读写性能方面必须与 PyStore 一样高效,这违背了首先拥有预制库的目的。例如,如果存储机器使用 PyStore 读取并发送 JSON,那么我必须在 Django 中解析 JSON,这会增加大量开销……我会比现在使用 SQL+Pandas 更慢。我想 PyStore/Arctic 需要 在使用数据的驱动器上运行以提高其性能:如果我错了,请纠正我
-
别忘了提到的其他选项,比如 InfluxDB。
-
不,它没有。北极使用 mongoDB 来存储数据,并且可以在任何地方。 pyStore 使用类似文件的系统来存储数据,并且可以在任何可以访问文件的地方。在 AWS 上,您可以使用由多个运行 pystore 的 EC2 实例共享的 S3 或 EFS 卷。
-
如何在一台机器和另一台机器之间传输 Pandas 数据帧?您是否不必序列化数据(如果是:哪种格式?)。或者 pyStore 有序列化/反序列化支持吗?我认为序列化/反序列化将是一个巨大的开销,但如果不是这种情况,这可能是解决方案......我也会研究 InfluxDB。感谢您的提示!