- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在构建一个 CGI 脚本来轮询 SQLite 数据库并构建一个统计表。源数据库表如下所述,相关代码块也是如此。一切正常(功能上),但 CGI 本身非常慢,因为我有多个嵌套的 SELECT COUNT(id)
调用。我认为我最好的优化方法是询问 SO 社区,因为我在 Google 的时间相对没有什么成果。
表格:
CREATE TABLE messages (
id TEXT PRIMARY KEY ON CONFLICT REPLACE,
date TEXT,
hour INTEGER,
sender TEXT,
size INTEGER,
origin TEXT,
destination TEXT,
relay TEXT,
day TEXT);
(是的,我知道该表未规范化,但它填充了邮件日志中的摘录...我很高兴能够提取和填充工作,更不用说规范化了。我不认为该表结构在这一点上与我的问题有很大关系,但我可能是错的。)
示例行:
476793200A7|Jan 29 06:04:47|6|admin@mydomain.com|4656|web02.mydomain.pvt|user@example.com|mail01.mydomain.pvt|Jan 29
还有,构建我的表的 Python 代码:
#!/usr/bin/python
print 'Content-type: text/html\n\n'
from datetime import date
import re
p = re.compile('(\w+) (\d+)')
d_month = {'Jan':1,'Feb':2,'Mar':3,'Apr':4,'May':5,'Jun':6,'Jul':7,'Aug':8,'Sep':9,'Oct':10,'Nov':11,'Dec':12}
l_wkday = ['Mo','Tu','We','Th','Fr','Sa','Su']
days = []
curs.execute('SELECT DISTINCT(day) FROM messages ORDER BY day')
for day in curs.fetchall():
m = p.match(day[0]).group(1)
m = d_month[m]
d = p.match(day[0]).group(2)
days.append([day[0],"%s (%s)" % (day[0],l_wkday[date.weekday(date(2010,int(m),int(d)))])])
curs.execute('SELECT DISTINCT(sender) FROM messages')
senders = curs.fetchall()
for sender in senders:
curs.execute('SELECT COUNT(id) FROM messages WHERE sender=%s',(sender[0]))
print ' <div id="'+sender[0]+'">'
print ' <h1>Stats for Sender: '+sender[0]+'</h1>'
print ' <table><caption>Total messages in database: %d</caption>' % curs.fetchone()[0]
print ' <tr><td> </td><th colspan=24>Hour of Day</th></tr>'
print ' <tr><td class="left">Day</td><th>%s</th></tr>' % '</th><th>'.join(map(str,range(24)))
for day in days:
print ' <tr><td>%s</td>' % day[1]
for hour in range(24):
sql = 'SELECT COUNT(id) FROM messages WHERE sender="%s" AND day="%s" AND hour="%s"' % (sender[0],day[0],str(hour))
curs.execute(sql)
d = curs.fetchone()[0]
print ' <td>%s</td>' % (d>0 and str(d) or '')
print ' </tr>'
print ' </table></div>'
print ' </body>\n</html>\n'
我不确定是否有任何方法可以组合一些查询,或者从不同的角度处理它以提取数据。我还考虑过构建第二张表,其中包含计数,并在更新原始表时更新它。我今天一直盯着这个看太久了,所以明天我要重新开始攻击它,希望能从专家那里得到一些见解;)
编辑:使用下面提供的 GROUP BY 答案,我能够在一个查询中从数据库中获取所需的数据。我转而使用 Perl,因为 Python 的嵌套 dict 支持对于我处理此问题所需的方式(以特定方式构建一组 HTML 表)来说效果不是很好。下面是修改后的代码片段:
my %data;
my $rows = $db->selectall_arrayref("SELECT COUNT(id),sender,day,hour FROM messages GROUP BY sender,day,hour ORDER BY sender,day,hour");
for my $row (@$rows) {
my ($ct, $se, $dy, $hr) = @$row;
$data{$se}{$dy}{$hr} = $ct;
}
for my $se (keys %data) {
print "Sender: $se\n";
for my $dy (keys %{$data{$se}}) {
print "Day: ",time2str('%a',str2time("$dy 2010"))," $dy\n";
for my $hr (keys %{$data{$se}{$dy}}) {
print "Hour: $hr = ".$data{$se}{$dy}{$hr}."\n";
}
}
print "\n";
}
曾经需要 28.024 秒执行的任务现在需要 0.415 秒!
最佳答案
首先你可以使用group by子句:
select count(*), sender from messages group by sender;
这样您就可以为所有发件人执行一个查询,而不是为每个发件人执行一次查询。另一种可能性是:
select count(*), sender, day, hour
from messages group by sender, day, hour
order by sender, day, hour;
我没有测试它,但至少现在你知道 group by 子句的存在了。这应该会减少查询的数量,我认为这是提高性能的第一步。
其次,根据搜索列创建索引,在您的案例中是发件人、日期和时间。
如果这还不够,请使用分析工具找出花费时间最多的地方。您还应该考虑使用 fetchmany 而不是 fetchall 来保持低内存消耗。请记住,由于 sqlite 模块是用 C 编码的,因此请尽可能多地使用它。
关于python - 如何优化 SQLite 中的多个嵌套 SELECT(使用 Python)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2203709/
所以我试图设置“内容”类的高度,但它似乎不起作用。我对嵌套 DIV 非常陌生,我已经尝试了我在谷歌搜索中发现的修复程序,但似乎没有任何效果。帮助?
好的,所以我一直在四处寻找,但找不到这个问题的答案。但是,我需要将一个 View 嵌套在另一个 View 中。 我有一个 $layout 正在使用我拥有的 default.layout Blade 文
好的,所以我一直在四处寻找,但找不到这个问题的答案。但是,我需要将一个 View 嵌套在另一个 View 中。 我有一个 $layout 正在使用我拥有的 default.layout Blade 文
基本上,我的问题很简单,但它需要知道 Struts 1.1 并且还活着的人。 我尝试构建的伪代码看起来像这样: IF element.method1 = true THEN IF element
我正在尝试将 Excel 嵌套 IF 语句转换为代码语言,但我不确定我是否正确执行此操作,希望能得到一些帮助 这是Excel语句: =IF(D3="Feather",IF(OR(I3>1000,R3=
如果我们创建两个或三个评论并对其进行多次回复,则“有用”链接在单击时会导致问题,它会对具有相同编号的索引执行 ng-click 操作,从而显示具有相同索引的所有文本。如何解决此嵌套问题,以便在单击链接
我在项目中使用Scala,想与Stripe集成,但它只提供Java API。例如,要创建 session ,我使用: val params = new util.HashMap[String, Any
以下代码有一个 Div,其中连续包含四个较小的 Div。四个 Div 中的每一个还包含一个较小的 Div,但此 Div 未显示。我尝试了各种显示和位置组合,看看 div 是否会出现。 classGoa
我在这里有一个问题,循环是: for (i=0; i < n; ++i) for (j = 3; j < n; ++j) { ...
我正在尝试编写代码来显示具有奇数宽度的形状。形状完成后,将其放置在外部形状内。用户将能够输入用于形状的字符和行数。我希望生成一个形状,并通过 for 循环生成一个外部形状。 ***** .
$(".globalTabs").each(function(){ var $globalTabs = $(this); var parent = $globalTabs.parent
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve th
所以我在这个问题上遇到了一些麻烦,因为变量 i。我只是不确定在第二个 while 循环中如何处理它。对于我的外循环,我知道它将运行 log_4(n^2) 次迭代。对于内部 while 循环,我计算的迭
我似乎找不到在枚举上应用多个 if/then 逻辑的工作方式。 anyOf 不应用条件逻辑,而是表示如果其中任何一个匹配则很好。 allOf 再次不应用条件逻辑,而是测试属性/必填字段的超集。 这是一
如何访问 ReaderT 的内部 monad。 在我的例子中,我有类型: newtype VCSSetupAction a = VCSSetupAction (ReaderT (Maybe VCSCo
这个问题在这里已经有了答案: Add leading zeroes/0's to existing Excel values to certain length (7 个回答) 7年前关闭。 我正在寻
我已经绑定(bind)了很多 AND/OR 函数的组合并且没有运气。 这是我需要创建的: 在 B 列中,我有公司 ID,范围从两个数字字符到六个数字字符。 我需要在 B 列中的每个公司 ID 之前的每
我是 VBA 新手,在尝试编写的宏中使用 If 语句时遇到了一些困难。每个月我都会收到一份 Excel 报告,其中列出了我们公司的哪些员工执行了某些任务。我正在编写的宏旨在将每个员工的数据复制并粘贴到
如果在 B 列中找到单元格 A1 中的值,则使用文本 321 填充除非在 C 列中找到单元格 A1 中的值,在这种情况下填充文本 121反而。如果单元格 A1 的内容不在 B 列或 C 列中,则使用
我有几十万个地址。其中一些在整数之后有粒子。如 4356 A Horse Avenue , 其他格式正常4358 Horse Avenue .有些有“A”,有些有“B”。我正在尝试删除整数和粒子之间的
我是一名优秀的程序员,十分优秀!