【发布时间】:2016-08-19 18:24:11
【问题描述】:
我有一个包含约 300 万场国际象棋比赛的数据集(现有列包括玩家姓名、日期、结果和锦标赛名称)。我想用随机森林来预测棋局的结果。
为此,我想做一些特征工程。我认为有几个变量会成为强有力的预测因素,例如球员迄今为止在比赛中的成绩,比赛前90天的比赛次数。
列:
- date DATE
- namew TEXT
- nameb TEXT
- whiterank INTEGER
- blackrank INTEGER
- tournament TEXT
- t_round INTEGER
- result REAL
- id BIGINT
- chess_data2_pkey(id)
指数:
game_index INDEX chess_data2 (namew ASC, tournament ASC, date ASC)
不幸的是,我的查询速度相当慢(我写了 14 个并在一个较小的数据集上对其进行了测试,甚至 1 个都没有在 8 天内完成)。下面是简化版,我2小时前放的,还是没有结果。
SELECT Sum(result)
INTO temp
FROM chess_data2 t1
WHERE id IN (SELECT t2.id
FROM chess_data2 t2
WHERE t1.tournament = t2.tournament
AND t1.namew = t2.namew
AND t1.date < t2.date)
我的问题:
- 我能否在 SQL 中加快这项工作的速度(在我的 i7-4710HQ 和 12gb 的 RAM 上,在不到 10 天的时间内完成 14 个类似的查询?)。也许通过事先明确排序?
- 还有其他方法可以更快地实现我的目标吗?我尝试使用 Python 中的循环天真地编写此代码,但性能更差,但我听说 C 更适合这些东西 - 但到底好多少?
我使用 Python 3.5 进行估计,使用 psycopg2 处理 SQL。
编辑:感谢大家的帮助。我设法成功地使用索引使一些查询变得非常快,例如这个:
# Number of points that the white player has so far accrued throughout the tournament
(SELECT coalesce(SUM(result),0) from chess_data2 t2
where (t1.namew = t2.namew) and t1.tournament = t2.tournament
and t1.date > t2.date and t1.date < t2.date + 90)
+ SELECT coalesce(SUM(1-result),0) from chess_data2 t2
where (t1.namew = t2.nameb) and t1.tournament = t2.tournament
and t1.date > t2.date and t1.date < t2.date + 90 ) AS result_in_t_w
from chessdata2 t1
现在只需要大约 60 秒,这是可以接受的。但是,由于某种原因,像这样的计数选择需要半个多小时(我没有等待更长时间)来计算:
# Number of games that the white player has so far played in the tournament
(SELECT count(*) from chess_data t2 where (t1.namew = t2.namew) and
t1.tournament = t2.tournament and t1.date > t2.date and t1.date < t2.date + 90)
+ (SELECT coalesce(count(*),0) from chess_data2 t2
where (t1.namew = t2.nameb) and t1.tournament = t2.tournament
and t1.date > t2.date and t1.date < t2.date + 90) AS games_t_w from chess_data2 t1
我想我以错误的方式使用索引,但我不知道出了什么问题,它与以前基本相同,但我计算的不是对结果列求和,而是行总和......这是否有意义?
【问题讨论】:
-
在尝试提高查询性能时,您应该检查
EXPLAIN ANALYZE。 READ -
我们可以查看您的数据库架构和定义的索引吗?
-
@halfer 我添加了有关列和索引的信息(从 pycharm 复制),这是您所期望的吗?
-
是的,这很好。
id上没有主键索引吗? -
不,我们使用了“UPDATE chess_data2 SET id = DEFAULT”。所以我想我应该运行 ALTER TABLE chess_data2 ADD PRIMARY KEY (id)?就可以了。
标签: python sql postgresql machine-learning bigdata