Ленивая Карта На Qt

Qt имеет возможность выполнять вашу функцию параллельно для каждого члена последовательности.

QtConcurrent::mapped() и его друзья.

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

Код: 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; }

Все это еще довольно сыро; например, невозможно запустить несколько задач в одном пуле, чтобы они не мешали друг другу.

Вы можете предложить свои улучшения.

Теги: #Qt #пул потоков #параллельные вычисления #map #Qt

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.