我正在开发一个Django应用程序。用例场景如下:
50个用户,每个用户最多可以存储300个时间序列,每个时间序列大约有7000行。你知道吗
每个用户可以随时请求检索其300个时间序列中的所有数据,并请求为每个数据序列对最后N行执行一些高级数据分析。数据分析不能在SQL中完成,但在Pandas中,它不需要太多时间。。。但是在不同的数据帧中检索300000行就可以了!你知道吗
用户还可以询问一些可以在SQL中执行的分析的结果(比如aggregation+sum-by-date),这要快得多(如果这就是全部的话,我就不会写这篇文章了)。你知道吗
浏览和思考之后,我发现用SQL存储时间序列不是一个好的解决方案(阅读here)。你知道吗
理想的部署架构是这样的(每个bucket都是一个独立的服务器!):
问题:SQL中的时间序列太慢,无法在多用户应用程序中检索。你知道吗
研究解决方案(来自this article):
以下是一些问题:
1)尽管这些解决方案在将数百万行时间序列拉入单个数据帧时速度非常快,但我可能需要将大约50万行拉入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可以更快地做到这一点,这也意味着我失去了将db与Django实例解耦的能力,可以更好地有效地使用一台机器的资源,但只能使用一个,不能扩展(或者使用与机器一样多的独立数据库)。PyStore/Arctic能否避免这种情况并为远程存储提供适配器?你知道吗
有没有一个Python/Linux解决方案可以解决这个问题?我可以用哪种架构来克服它?我是否应该放弃我的应用程序的可伸缩性和/或接受每N个新用户我就必须生成一个单独的数据库?你知道吗
你在帖子中提到的那篇文章可能是你问题的最佳答案。显然,很好的研究和一些好的解决方案正在被提出(别忘了看看XDB)。你知道吗
关于将存储解决方案与实例分离的问题,我看不出有什么问题:
因此,只要您将备份存储与实例分离,并使它们在实例之间共享,就可以使用与posgreSQL数据库相同的设置:mongoDB或InfluxDB可以在单独的集中式实例上运行;pyStore的文件存储可以共享,例如使用共享的装入卷。访问这些存储的python库当然会在django实例上运行,就像psycopg2一样。你知道吗
相关问题 更多 >
编程相关推荐