2016-09-15 12 views
0

私は従業員情報を含むデータベースを持っています。私には4000人の従業員がいる。各従業員は固有の識別番号を持っています。 私は、各従業員の従業員情報をPythonスクリプトを使用してデータベースから取得しようとしています。従業員1人の場合、情報を取得する実行時間は1秒です。 4000人の従業員の場合、それは4000秒(67分、それはどれくらい長く待っていますか?)になります。 従業員に関する情報は、次の形式で、辞書に格納する必要があります。Pythonスレッドモジュールは実行時間を短縮しますか?

infos = {"ID1": ["info for employee 1"], "ID2": ["info for employee 2"], ... } 

私は、実行時間を短縮するために、以下をやってと思っています:

  1. は、従業員ID番号
  2. を取得しますID番号を10個のグループに分割する
  3. 同時に10個のスレッドを開始する
  4. 各スレッドに10個の従業員IDグループの1つを使用させ、最後に、別の辞書
  5. にデータベースから情報 、これらの10冊の辞書

を組み合わせ、それは可能ですか?この方法は実行時間を10倍に短縮できますか?

+0

76分は非常に長い時間です。データベースに4000回接続していますか、または1回だけ接続していますか? –

+0

私は一度だけ接続しますが、10スレッドを開始すると、10個の別個のコネクタを使用する必要があると思います。 – alwbtc

+0

パンダデータフレーム全体のEmployeeデータを一度に読み込むことはできますか?そして、残りの処理はPythonで行いますか? – Jaco

答えて

0

同時実行を混同していると思います。

スレッディングは、単に複数の実行スレッドを同時に使用する行為です。これは、同時に複数のアクションが実行されていることを意味するものではありません...あなたのプロセッサはスレッド間で切り替えなければなりません。このテクニックは、操作が完了するまで(長いファイルを読み込むなど)長い時間待つことを期待している間に他のものが実行されるようにする場合に便利です(進捗バーを印刷するなど)。

同時実行は、複数のスレッドを作成し、プロセッサ内の異なるコアに異なるスレッドを割り当てる場合です。もちろん、これはハードウェアに依存しています(マルチコアプロセッサが必要です)。

Pythonのthreadingモジュールでは、複数のスレッドを作成できます。理想的な世界では、自動的に並行処理を処理します。しかし、デフォルトのPythonインタプリタであるCPythonでは、 "Global Interpreter Lock"のためにネイティブの同時実行が許可されていません。実際には、threadingを使用すると、あなたの実行をより遅くhere参照)にすることさえできるかもしれません(GHについての詳細は、this pageの見出しセクションのすぐ上にあり、this SO postを参照してください)。

私はPythonで並行処理を行っていませんが、可能な解決策としてmultiprocessingモジュールをチェックアウトすることをお勧めします。

+0

Intel Core I5 CPUを使用しているWindows 7マシンでは不可能だと言っていますか?各スレッドは情報を別の辞書にフェッチします(つまり、同じメモリ位置を使用しません)。別のデータベースコネクタオブジェクトを使用しますが、これはまだできませんか? – alwbtc

+0

デフォルトのPythonインタプリタで@alwbtc 'threading'は同時実行を許可しません。 OSは問題ではなく、利用可能なコアの数は関係ありません。並行実行が必要な場合は、 'multiprocessing'やCPython以外のPythonの別の実装を調べてください。しかし、そのクエリが完了するまでに1時間以上かかる場合、コードに何か間違っていると思います。 –

+1

それは減速が起こっているところによって異なります。データベースが1秒間に1つのクエリにしか応答できない場合、クエリをより早く送ることができたとしても、それは役に立たないでしょう。 –

関連する問題