2016-11-01 26 views
0

私はディスク上の多くのファイルを読む必要がある、第一のオプションは、マルチスレッドを使用して、それはSSDで非常に良いパフォーマンスを発揮します。 (IOでブロックされたスレッドがGILを解放するとき)pythonマルチスレッドは、読み取り専用メモリバッファバイパスを読み取るGIL

しかしSSDなしで同様の速度を達成したいので、それらをメモリにプリロードして、すべてのスレッドが各ファイルを読み込みますメモリからのコンテンツ。残念ながら、おそらくGILのために、dictにロックがあるので、その速度はSSDからファイルをロードするよりもさらに遅くなります!

私の質問は、ロック/ GILなしで読み取り専用メモリバッファを作成できるソリューションがあるということですか? RAMディスクのようなもの>

+0

本当にできるだけ多くのスピードが必要な場合は、CやC++や完全にコンパイルされた他の言語でプログラム(またはそれ以上スピードクリティカルな部分)を書き直すのはどうですか?その後、ネイティブの実行可能ファイルを実行しているので、GILを持たず、インタプリタのオーバーヘッドもまったくありません。 –

答えて

1

要するに、いいえ。

Python(特にCPython)はマルチスレッド言語ですが、いつでもインタプリタはPythonコードを1つしか実行できません。したがって、純粋なPythonプログラムがI/O(例えば、アクセスロックフリーメモリバッファ)をブロックすることがない場合、あなたが何をしていてもシングルスレッドプログラムに劣化します。スリープしているスレッドは、アクティブなスレッドが再び動作するまでに待機する必要があるため、パフォーマンスはシングルスレッドプログラムより悪くなります。

(謝辞Graham Dumpleton!)solutionの1つは、CPythonのC拡張を記述することです。そして、「Cの領域」に入るときにGILをリリースする。 GILの保護なしでPythonのものにアクセスできない場合は微妙なバグが発生するか、直接クラッシュすることに注意してください。

GILを使用しない実装がいくつかあります(JythonやCythonなど)。あなたはそれらを使ってみることができます。しかし、正しいマルチスレッドプログラムを書くのは難しいです。高速マルチスレッドプログラムを書くことはさらに困難です。私の提案は、マルチスレッドの代わりにマルチプロセスプログラムを書くことです。 IPCなどでデータを渡します(ZeroMQと言うと、使いやすく高速です)。

+1

CスレッドはCPythonのカバーの下で使用されるため、技術的には複数のスレッドを実行することができますが、Pythonコードを実行するには同時に複数のスレッドしか使用できません。あなたが描いているものと微妙な違い。 CPythonでC拡張を使用する場合、操作する必要のあるデータにPythonデータ・オブジェクトのPythonグローバル・インタプリタ・ロックを必要としない場合、複数のスレッドを同時にうまく実行できます。 –

+0

訂正ありがとう!私に書き直してみましょう;-) – HKTonyLee

0

@HKTonyLee回答にはいくつかの点を追加してください。

だから、PythonにはこのGILがあります。しかし、それは例えばファイルI/Oを行うときにリリースされます。つまり、ファイルを並列に読み取ることができます。プロセスの観点からはファイルのようなものはなく、ファイル記述子(posixを前提としています)だけですので、それを読んだものはディスクに格納する必要はありません。

ファイルを(例えば)tmpfsまたはRAMDiskまたは同等のものに移動すると、SSDでさらに優れたパフォーマンスを得ることができます。しかし、リスクに注意してください:ファイルを変更する必要がある場合は、更新が失われる可能性があります。

関連する問題