Qtのレイジーマップ

Qtには、シーケンスの各メンバー(QtConcurrent :: mapped()とその友人に対して関数を並列に実行する機能があります。



問題は1つだけです。結果はQVectorに保存されます。 したがって、6,500万個のデータの機能を果たす必要があるとき、RAMを苦しめることはせず、同じことについて書いただけで、より怠zyなだけです。つまり、古い値が既に使用されている場合にのみ新しい値が計算されます。



コード: bitbucket.org/cblp/threadpool



ボンネットの下


ThreadPoolはQThreadPoolを継承します。 ThreadPool :: map()関数は、入力および変換関数でJavaスタイルの反復子を受け入れ、結果とともにJavaスタイルの反復子を返します。



関数はQRunnableにラップされ、M = maxThreadCount個の数(通常、これはプロセッサの数)でQThreadPoolにスローされます。



FutureIteratorは、次の結果がある場合はそれを返す、または次の結果が準備されるまでブロックされるhasNext()およびnext()メソッドを提供します。 M個の現在のタスクが完了し、誰も結果に来なかった場合、計算機はブロックされます。





標準入力から文字列を読み取り、それぞれからソルトでN倍MD5をカウントし、結果を標準出力に書き込みます。 (これは非常に変更された実際の例です。)



const uint N = 10000; const QString Salt = "5417"; QByteArray md5_N_times(QString line) { QByteArray data = line.toUtf8(); for ( uint i = 0; i < N; ++i ) data = QCryptographicHash::hash(Salt.toUtf8() + data, QCryptographicHash::Md5); return data; } int main() { QTextStream input(stdin); QTextStream output(stdout); ThreadPool pool; FutureIterator<QByteArray> results = pool.map( QTextStreamIterator(input), md5_N_times ); while ( results.hasNext() ) output << results.next().toHex() << endl; return 0; }
      
      







これはすべてかなり湿っています。たとえば、1つのプールで複数のタスクを実行して相互に干渉しないようにすることはできません。 改善点を提供できます。



All Articles