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
-
Установка Php На Ubuntu
19 Oct, 24 -
Nokia 8600 Luna Реальные Фотографии
19 Oct, 24