2012-04-20 19 views
3

私はC++/cli画像処理ライブラリに取り組んでおり、コードを最適化しようとしています。基本的に、イメージのSystem :: Drawing :: Bitmapが渡されます。次に、ディスクに書き込んだり、複雑な解析を実行したり、解析結果を返したりする必要があります。私は、スピードアップのためにイメージをディスクに書き込むことができると思った(私のアルゴリズムはイメージを変更しない)。しかし、私は多くのスレッドで作業していないので、私はこれを行うための最良の方法はあなたの入力を得たいと思った。ディスクにデータを並列に書き込む?

string ProcessImage(System::Drawing::Bitmap ^bmp, System::String^ targetFile) 
{ 
    bmp->Save(targetFile); 
    System::Drawing::Bitmap^ bmp8 = BitmapConvertPixelFormat(bmp, 8); //<-- a function I wrote which converts the 32bpp I am passed into an 8bpp one 
    string results = Analyze(bmp8); //<--- takes a good bit of time 
    return results; 
} 

ご意見をお聞かせください。 ありがとうございます!

+0

さらに仕様が必要です。 (1)分析開始前に利用可能なデータを書き込む、(2)分析が進行中にデータを書き込む、または(3)分析が完了した後にのみ使用可能なデータを書き込むことを希望しますか?それとも全く別のもの? – JustJeff

+0

@JustJeff:彼が与えているサンプルコードから、私はそれが(1)のケースだと信じています。スレッド処理が多大な労力をかけずに手助けをするケースがあります。 @LieRyan - –

+0

- 合意しました。まだOPに確認して欲しいです – JustJeff

答えて

6

1台の機械ディスクと並列に/から読み書きするのは良い考えではありません。なぜなら機械ヘッドはI/O要求を処理するたびに回転する必要があるからです。オーバーヘッド。

少しベンチマークを試みることができますが、私は単なるスレッドを使い、順番に書くことに頼らざるを得ません。

+0

ではないです。実質的に重要なOSでは、ディスクの読み込み/書き込みはOSによってバッファリングされます。 –

+1

@Lie Ryan:I/Oリクエストがバッファリングされて後で発行され、何らかの形で最適なパターン(希望的な考え方)で並べ替えられたとしても、最大1つのライタースレッド。 – Tudor

+0

私は、OPのある部分を他の部分を書くことと並行して書くのではなく、ディスク書き込みと並行してOPが "複雑な分析を実行する"ことを意味すると考えました。 – JustJeff

2

他のスレッドへのディスク書き込みをキューイングすることは、qoodの考えのように思えますが、複雑な解析が遅いディスク書き込みを実行しないで実行できるように、ディスクあたり1つのライタースレッドのみになります。

+0

解析コードがデータを変更しないため、同期することはほとんどありません。これは、解析入力データであり、出力ではなくディスクに書き込まれるため、並列処理が可能です。データの生涯管理に関して、OPは制約を提供しないので、私はそれに言及していませんでした。これらの操作の後にデータをdelete()しなければならない場合は、最後の解析/ライターがデータオブジェクトを削除するように、おそらく原子refCountを使用します。 –

1

価値がある場合は、Parallel HDF5の使い方を理解するために時間を費やすことができます。これは、ファイルに並行して書き込むことができます。

関連する問題