середа, 5 березня 2008 р.

Google MapReduce Qt realisation. Конкурентні потоки.

Google розробка MapReduce реалізована в Qt 4.4.x. Що ж це таке і як воно працює ?

Ця розробка задумана для полегшення програмування і обчислення поширених завдань на багатопроцесорних кластерах. В Qt вона реалізована для мультиядерних систем.

API виглядає так:

QFuture mappedReduced(list, mapFunction, reducefunction);
Припустимо що нам потрібно порахувати частоту появи слів в декількох документах:
В цьому випадку map функція буде рахувати входження слів в кожному документі паралельно, а reduce об'єднає результати в фінальне значення частоти.

На вході маємо список текстів що містять документи:
QList list;
map функція бере документ і повертає хеш із данними про кількість входження кожного слова в документі.
QHash mapFunction(const QString &document);

Reduce функція братиме проміжні результати виконання map і формуватиме фінальний результат. Система забезпевить виклик reduce тільки однією map одночасно.
void reduceFunction(QHasht &finalResut, const QHash &intermediateResult);

Тепер можна використати це все разом:
QFuture<qhash >counting =  mappedReduced(list, mapFunction, reduceFunction);
Оскільки mappedReduced( ) повертає QFeature є декілька способів синхронізуатися з результатом. Найпростіший спосіб це просто викликати QFuture::result() що заблокує виконання поки результат не буде готовий. Якщо блокування не допустиме (програма має графічний інтерфейс) можна використати сигнал-слот зв'язок щоб відобразити стан обчислень та отримати результат. Також можливо зупинити обчислення QFuture::cancel().

Таким способом зручно виконувати багато поширених завдань: пошук, сортування, компресія, тощо.

Лінки:
Qt Concurrent integrated!
MapReduce was originally developed by Google to simplify writing parallel algorithms for computer clusters.

Немає коментарів:

Дописати коментар