私は〜300万チェスのゲームのデータセットを持っています(既存の列にはプレイヤの名前、日付、結果、トーナメント名が含まれています)。ランダムフォレストを使ってチェスゲームの結果を予測したい。大規模なデータセット(〜3Mのエントリ)にPostgreSQLを使用したフィーチャエンジニアリング
この目的のために、私はいくつかのフィーチャエンジニアリングを行いたいと思います。強力な予測変数と思われるいくつかの変数があります。これまでのトーナメントでの試合結果、ゲームの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)
は、残念ながら、私のクエリはかなり遅かった(私は、でも1は、8日に完成したではない14を書き、小さいデータセットでそれらをテストしました) 。以下は簡略化したものですが、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)
私の質問:
- は、私は私のi7-4710HQとRAMの12ギガバイトの10日未満で完全な14と同様のクエリ、のように速く(SQLに速くこの作業を行うことができますか? )。おそらく事前に明示的にソートすることによって?
- 私の目標をより速く達成できる方法は他にありますか?私はPythonでこのループを使用してコードを素朴にしようとしましたが、パフォーマンスはさらに悪化しましたが、Cがこのようなものには優れていると聞きました。
私は推定にはPython 3.5を使用し、SQLにはpsycopg2を使用します。
編集:ありがとうございました。インデックスの使用を成功させ、クエリの一部を非常に高速にしました。この1つ:
これ以上受け入れられるのは約60秒です。私は間違った方法でインデックスを使用しているI推測
# 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
を私:しかし、何らかの理由で、カウントはこの1つのように選択した時間半以上かかる計算するために(私は長く待つことはありませんでした)何が間違っているのか分かりませんが、これは基本的に以前と同じですが、結果の列を合計するのではなく、行の合計を計算します...それはまったく意味がありますか?
をしたいです。 [** READ **](http://stackoverflow.com/questions/12915209/how-to-understand-an-explain-analyze) –
データベースのスキーマと定義済みのインデックスを確認できますか? – halfer
@halfer私は列とindeces(pycharmからコピー)についての情報を追加しました、それはあなたが期待していたものですか? – JohnnyQ