2

たくさんのファイルをpdfに変換する小さなプログラムを書きました。

プログラムは次のことを行います。

  • フォルダからオブジェクトの配列を取得する FileInfo(10'000ドキュメント)
  • それぞれについてFileInfo
    • FileInfo.CopyTo()、を使用してバックアップコピーを作成します
    • いくつかのAsposeライブラリを使用してドキュメントをPDFに変換します
    • 変換後、PDFを新しい宛先にコピーします
    • foreach内で、イベントが発生し、WinForm UIによって処理されて、進行状況が表示されます

ドキュメントのサイズによっては、ドキュメントの変換に0〜3秒かかる場合があります。それが完璧な候補になると思ったParallel.ForEachので、プログラムを変更しました。

ただし、変換には、従来のforeachでは1時間ではなく、1.5時間かかりましたParallel.Foreach(私が試したサーバーには、2つのIntel Xeon Procsがあります)。

何を間違えたのですか、それともパフォーマンスを向上させるために何を考慮する必要がありますか?

4

3 に答える 3

1

Parallel.Foreachの速度が低下する原因となる可能性のあるいくつかの問題について考えることができます。

  1. プロセッサよりも多くのスレッドを実行しています。
  2. AsposeLibrariesはマルチスレッドをサポートしていません。
  3. スレッドセーフであり、異なるスレッドから同時に到達できないGUIスレッドへの複数のアプローチ。

また、タスク並列ライブラリに関する以前の回答を読むことをお勧めします-シングルコアでの並列処理

それはシングルコアについて話しますが、それはあなたの問題を反映することができます。

于 2012-09-03T14:05:42.943 に答える
1

タスク マネージャーで CPU を調べ、リソース モニターでディスク I/O 応答時間/キューの長さを調べたり、さまざまな利用可能なパフォーマンス カウンターを調べたりして、操作が CPU バウンドか I/O バウンドかを確認することをお勧めします。

あなたの問題は、複数のファイルのコピー (バックアップの作成と変換されたファイルの書き込みの両方) を同時に行っている可能性が最も高いと思われます。ハードディスクは、ランダムアクセスと比較して、シーケンシャルアクセス(一度に1つのファイルのみを読み書きする場合)の方がはるかに高速です。

于 2012-09-03T14:18:16.533 に答える
0

それはかなりの数に依存します。MaxDegreeOfParallelism を 2 に設定してみてください。変換が CPU バウンドでシングル スレッドである場合、コアごとに 1 つあることが理想に近いはずですが、さらに実験してみてください。

しかし、まさにあなたのアプローチは、変換自体が複数のコアをうまく​​利用していないことを前提としています。もしそうで、それが CPU バウンドである場合、導入しようとしているコアの一種の並列使用を既に行っており、その理由で全体の効率が低下する可能性があります。

編集:svickのコメントに照らして、考えがより明確になりました。ライブラリがマルチスレッドの使用をサポートしていない場合、エラーなしでここまで到達する可能性は低いですが、マルチスレッドのサポートには多くの内部ロックが含まれる可能性があり、同時呼び出しが時折発生する場合は問題ない可能性がありますが、非常に高価です。長期的に重い同時実行性がある場合。

于 2012-09-03T14:07:53.377 に答える