Ленивый map на Qt

от автора

В Qt есть возможность параллельного выполнения вашей функции для каждого члена последовательности — QtConcurrent::mapped() и его друзья.

Проблема только в одном — результаты сохраняются в QVector. Поэтому, когда мне понадобилось выполнить свою функцию для 65 миллионов кусочков данных, я не стал мучать оперативку, а написал примерно то же самое, только чуть более ленивое, то есть новые значения будут вычисляться, только если старые уже использовались.

Код: bitbucket.org/cblp/threadpool

Пример

Прочитать из стандартного ввода строки, от каждой посчитать 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; } 

ссылка на оригинал статьи http://habrahabr.ru/post/155277/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *