6

そのため、これを投稿する前に大量の記事やフォーラムを確認しましたが、矛盾する回答を読み続けています. まず、OS は問題ではありません。Windows または Unix のいずれかを使用できます。問題に最適なものは何でも使用できます。読み取り専用の目的で使用する必要がある大量のデータがあります (これが問題になる理由はわかりませんが、問題が発生した場合に備えて、通過する必要があるデータ構造は、配列の配列です。値も配列であるハッシュの配列)。私は基本的に、「クエリ」をさまざまな「文」と比較し、それらの相対的な類似性を計算しています。これらの量 (数百万) から、上位の x% を取得して、何かを実行したいと考えています。このプロセスを並列化する必要があります。そこには' スペースを減らすには良い方法ではありません。良い結果を得るにはすべてを比較する必要があり、ある種のスレッド/フォークでは時間がかかりすぎます。繰り返しますが、私は多くの相反する答えを見てきましたが、どれをすべきかわかりません。

どんな助けでも大歓迎です。前もって感謝します。

編集:メモリ使用量が問題になるとは思いませんが、わかりません(8 GB RAM)

4

2 に答える 2

21

あなたの問題の詳細がなければ、与えることができる助けはあまりありません. プロセスを並列化したい。Perl のスレッドとフォークには、長所と短所があります。

Perl スレッドが他のスレッドと異なる重要な点の 1 つは、データがデフォルトで共有されないことです。これにより、スレッドの操作がはるかに簡単かつ安全になります。ライブラリやほとんどのコードのスレッド セーフについて心配する必要はありません。スレッド化されたビットだけです。ただし、Perl はインタープリターとすべてのロードされたモジュールのコピーを各スレッドに配置する必要があるため、パフォーマンスが低下し、メモリを大量に消費する可能性があります。

フォークに関しては、Unix についてのみ説明します。Perl は、スレッドを使用して Windows で fork をエミュレートします。動作しますが、遅くてバグがある可能性があります。

分岐の利点

  • フォークの作成が非常に高速
  • 非常に堅牢

フォークのデメリット

  • プロセス間の通信は遅く、扱いにくい場合があります

スレッドの利点

  • スレッドの調整とデータ交換はかなり簡単
  • スレッドはかなり使いやすい

スレッドの欠点

ドキュメントが最新の場合、最後のものは少しおかしなことです。大量の SQL を実行する場合は、スレッドを使用しないでください。

一般に、Perl スレッドから優れたパフォーマンスを得るには、スレッドのプールを開始してそれらを再利用するのが最善です。フォークは、より簡単に作成、使用、および破棄できます。

結局のところ、あなたの考え方とあなたの特定の問題に合うものは何なのかということです。

どちらの場合でも、ワーカーのプールを管理するための何かが必要になるでしょう。分岐には、 Parallel::ForkManagerまたはChildを使用する必要があります。Child は、プロセス間通信が組み込まれているため、特に優れています。

スレッドの場合、 threads::sharedThread::Queueを使用し、 perlthrtutを読み取ります。

Perl スレッドに関する記事を読むときは、2002 年に 5.8.0 で導入されたときは少しがらくたであり、5.10.1 までしかサービスを提供できないことに注意してください。その後、彼らはかなり固まりました。それらの効率性と堅牢性に関する情報と意見は、急速に時代遅れになる傾向があります。

于 2013-04-28T03:22:11.893 に答える
1

スレッド化は正しく行うのがより困難になる可能性がありますが、それほど多くのメモリを使用しません。

フォークは実装が簡単ですが、かなりの量のメモリを使用します。

どちらも経験がない場合は、フォークバージョンを実装することから始めて、そこから始めます。

于 2013-04-28T01:38:26.927 に答える