首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >改进Django切片阶跃性能

改进Django切片阶跃性能
EN

Stack Overflow用户
提问于 2016-12-01 05:38:53
回答 1查看 557关注 0票数 1

我有一个应用程序,在这个应用程序中,我使用Django实例存储来自多个独立实体的日志。然后,我有一个UX组件,它从django实例抓取日志文件并绘制值。为了保持合理,我尝试只获取日志值的一个样本,然后随着用户的放大而增加粒度。我的问题是,随着日志数量的增加,抓取每一组下采样的日志的时间正在不可持续地增长。

下面是模型的简化版本

代码语言:javascript
运行
复制
class LogModel(models.Model):
   localtime = models.DateTimeField(db_index=True)
   value1 = models.FloatField(blank=True, null=True)
   value1 = models.FloatField(blank=True, null=True)
   value1 = models.FloatField(blank=True, null=True)
   owner = models.ForeignKey('auth.User', related_name='logs')

下面是一个用于获取数据的示例查询:

代码语言:javascript
运行
复制
q = LogModel.objects.filter(owner=SomeOwner).order_by('localtime')
qNum = q.count()
logs = q[:qNum:(qNum/1000)]

有时运行这个查询需要很长的时间(~16s)。现在一个大型设备的日志数是150 K。如果有其他东西进入数据库,则可能需要很长时间(>1分钟)。

其他信息:系统: VM /2CPU,4GB内存数据库: PostgreSQL 9.3 OS: Ubuntu14.04

我试图遵循一般的优化数据库指导方针,但运气不佳。

我尝试过的事情:增加内存到数据库。限制并发大量数据库查询的数量(3)。

总的数据库不是很大,应该完全适合分配给数据库的1GB。我觉得我缺少一些关于这是如何工作的非常基本的理解,或者一个基本的优化。谢谢,

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-01 05:50:22

一开始,我以为您遇到了postgresql慢计数问题的一个变体,因为我误读了切片,从队列的尾部获取了1000个条目。这本身就会慢下来有两个原因:首先是前面提到的缓慢postgresql计数,其次是使用一个大偏移量使服务器对所有数据进行排序,然后跳到该偏移量。但是你吃的那片实际上更糟!!

代码语言:javascript
运行
复制
qNum = q.count()
logs = q[:qNum:(qNum/1000)]

您告诉ORM要计数行数(慢速),然后从其中提取每个nth行。不幸的是,SQL语言不支持极限和偏移量的“步骤”参数。

分割一个django 查询集以获取每个nth项实际上是在内存中使用django而不是在RDBMS级别上完成的。Django遍历整个查询集,将每个第n项复制到一个列表中,并返回该列表。所以毫不奇怪,它是缓慢的。索引是无用的,因为您正在强制读取整个表。

我建议使用F表达式在主键上应用模块化操作(您可以在postgresql中为其创建一个部分指数 )。

代码语言:javascript
运行
复制
LogModel.objects.annotate(idmod4=F('id') % 10).filter(idmod4=0)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40903339

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档