1

次の構造の100万を超えるレコードを持つテーブルがあります。

mysql> SELECT * FROM Measurement;
+----------------+---------+-----------------+------+------+
| Time_stamp     | Channel | SSID            | CQI  | SNR  |
+----------------+---------+-----------------+------+------+
| 03_14_14_30_14 |       7 | open            |   40 |  -70 |
| 03_14_14_30_14 |       7 | roam            |   31 |  -79 |
| 03_14_14_30_14 |       8 | open2           |   28 |  -82 |
| 03_14_14_30_15 |       8 | roam2           |   29 |  -81 |....

プロットのために、このテーブルからPythonにデータを読み込んでいます。問題は、MySQLの読み取りが遅すぎて、MySQLdb.cursors.SSCursor(このフォーラムのいくつかで提案されている)を使用してタスクを高速化した後でも、プロットを取得するのに何時間もかかることです。

con = mdb.connect('localhost', 'testuser', 'conti', 'My_Freqs', cursorclass = MySQLdb.cursors.SSCursor);
cursor=con.cursor()
cursor.execute("Select Time_stamp FROM Measurement")
for row in cursor:
    ... Do processing ....

テーブルを正規化すると、タスクをスピードアップするのに役立ちますか?もしそうなら、どのように正規化する必要がありますか?

PS:これがEXPLAINの結果です

+------------+--------------+------+-----+---------+-------+
| Field      | Type         | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| Time_stamp | varchar(128) | YES  |     | NULL    |       |
| Channel    | int(11)      | YES  |     | NULL    |       |
| SSID       | varchar(128) | YES  |     | NULL    |       |
| CQI        | int(11)      | YES  |     | NULL    |       |
| SNR        | float        | YES  |     | NULL    |       |
+------------+--------------+------+-----+---------+-------+
4

2 に答える 2

0

問題はおそらく、すべてのデータを一度にダンプしてから処理するのではなく、カーソルをループしていることです。数秒で数百万行をダンプできるはずです。次のようなことをしてみてください

cursor.execute("select Time_stamp FROM Measurement")
data = cusror.fetchall()
for row in data: 
   #do some stuff...
于 2013-03-18T16:02:13.727 に答える
0

テーブル全体読む必要があると言っているのですから、それについてはどうすることもできないと思います。100 万を超えるレコードがあります...データベース側であまり最適化するつもりはありません。

たった 1 件のレコードを処理するのに、どのくらいの時間がかかりますか? その部分を最適化してみるのもいいかもしれません。しかし、1 レコードあたり 1 ミリ秒まで短縮したとしても、テーブル全体を処理するには約 30 分かかります。大量のデータを扱っています。

複数のプロットジョブを並行して実行できますか? 上記と同じメトリックを使用して、データを 6 つの等しいサイズのジョブに分割すると、(理論的には) 5 分でプロットが得られます。

プロットを細かくする必要がありますか? データ内の特定の値を無視し、ユーザーが必要とする場合にのみ完全なプロットを生成する方法を探すことができます (ここでのワイルドな憶測、プロットがどのように見えるかは本当にわかりません)。

于 2013-03-18T16:08:03.450 に答える