1

私は、Pythonキューを使用してプロデューサ/コンシューマモデルをセットアップしました。あるプロデューサーでは、scipy.misc.imreadを使って画像を読んでいます。scipy.misc.imreadは複数のスレッドから実行するのが安全か効率的ですか?

1つのスレッドで画像を読み取る速度が十分ではなく、読み取りに1画像あたり約0.2秒かかります。 SSDから約20MB /秒の読み取り。

私は別の同じスレッドをpythonのthreadingモジュールを使って追加しようとしました。しかし、scipy.misc.imreadで費やされた時間は約2倍に増加し、2つのスレッドは1とほぼ同じ速さで画像を読み取るようになりました。

私のSSDはランダムリードでも40MB /秒のスループットを処理できると確信しています。 dd書き込みテストでは、書き込み速度は800MB /秒です。

scipy.misc.imreadがスレッドの中でクリティカルな領域として実行されているのか疑問に思っていますか?この問題を回避するにはmultiprocessingが必要ですか?

+0

'scipy.misc.imread'は、PILを囲む単なるラッパーです。画像の大きさはどれくらいですか?それらのフォーマットは何ですか(特に圧縮されていますか)。 –

+0

また、どのバージョンのPILをインストールしましたか?それはピローフォークですか、元のPILライブラリですか? [このコミット](https://github.com/python-pillow/Pillow/pull/1224)まで、Pill/PILは画像の解読中にGILを解放しませんでした。私は手元を持っていませんが、元のPILもGILをリリースしていないと思います。 –

+0

私はAnacondaを使用していますので、どのバージョンにも付属しています。私はマルチプロセッシングで最初のテストを実行しましたが、同じ問題はないようですが、私の目が私を欺いていないことを確認するために、さらにいくつかのテストを実行する必要があります。画像はそれぞれ2MBで、20枚/秒の速度で読み込んでキューに入れる必要があります。 –

答えて

0

scipy.misc.imreadは複数のスレッドから安全ですが、呼び出しごとにグローバルインタープリタがロックされるため、パフォーマンスはマルチスレッドの恩恵を受けません。

これはマルチプロセッシングからうまく機能し、予期しない問題は発生しません。

関連する問題