私は、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
が必要ですか?
'scipy.misc.imread'は、PILを囲む単なるラッパーです。画像の大きさはどれくらいですか?それらのフォーマットは何ですか(特に圧縮されていますか)。 –
また、どのバージョンのPILをインストールしましたか?それはピローフォークですか、元のPILライブラリですか? [このコミット](https://github.com/python-pillow/Pillow/pull/1224)まで、Pill/PILは画像の解読中にGILを解放しませんでした。私は手元を持っていませんが、元のPILもGILをリリースしていないと思います。 –
私はAnacondaを使用していますので、どのバージョンにも付属しています。私はマルチプロセッシングで最初のテストを実行しましたが、同じ問題はないようですが、私の目が私を欺いていないことを確認するために、さらにいくつかのテストを実行する必要があります。画像はそれぞれ2MBで、20枚/秒の速度で読み込んでキューに入れる必要があります。 –