我正在开发一个Django应用程序。使用案例如下:
有50个用户,每个用户最多可以存储300个时间序列,每个时间序列大约有7000行。
每个用户随时都可以要求检索他们的所有300个时间序列,并要求对它们中的每一个在最后N行上执行一些高级数据分析。数据分析不能在SQL中完成,但在Pandas中可以完成,这不需要太长时间……但是检索30万行分别在数据框中完成!
用户还可以要求执行一些可以用SQL执行的分析结果(例如按日期聚合+总和),这样速度会快得多(如果只是这些问题,我就不会写这篇文章了)。
浏览和思考之后,我发现将时间序列存储在SQL中并不是一个好的解决方案(请参阅此处)。
理想的部署架构如下(每个bucket是一个单独的服务器!):
问题:在多用户应用程序中,SQL中的时间序列检索速度太慢。
研究过的解决方案(来自这篇文章):
以下是一些问题:
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 个用户就必须生成一个单独的数据库的事实?