>>> агг2 = map(lambda х: 2 * х, arrl)
[2, 4, 6, 8, 10]
1
|
2 3 4 5
|
1 1 1 1 4.
|
2
|
4
|
6 3 1Ф
|
Массив агг2 теперь содержит значения [2, 4, б, 8, 19] — все элементы arrl увеличились вдвое! Удвоение выполняется достаточно быстро. Но представьте, что выполнение применяемой функции требует больше времени. Взгляните на следующий псевдокод:
>>> arrl = # Список URL
>>> агг2 = map(download_page, arrl)
Имеется список URL-адресов, нужно загрузить каждую страницу и сохранить содержимое в агг2. Для каждого адреса загрузка занимает пару секунд. Для 1000 адресов потребуется пара часов! А теперь представьте, что у вас имеется 100 машин и тар автоматически распределяет работу между ними. Тогда в любой момент будут загружаться сразу 100 страниц одновременно, и работа пойдет намного быстрее!
Функция reduce
Функция reduce иногда сбивает людей с толку. Идея заключается в том, что весь список элементов «сокращается» до одного элемента. Напомню, что функция тар переходит от одного массива к другому.
1
|
2 3 4 5
|
11114
|
2
|
4
|
6 3 10
|
С функцией reduce массив преобразуется в один элемент.
\и/у
15-
Пример:
>>> arrl = [1, 2, 3, 4, 5]
>>> reduce(lambda х,у: х+ул arrl)
15
В данном случае все элементы в массиве просто суммируются: 1 + 2 + 3 + 4 + 5 = 15! Я не буду рассматривать свертку более подробно, потому что в Интернете хватает руководств по этой теме.
MapReduce использует эти две простые концепции для выполнения запросов на нескольких машинах. При использовании большого набора данных (миллиарды записей) MapReduce выдаст ответ за минуты, тогда как традиционной базе данных на это потребуются многие часы.
Фильтры Блума и HyperLogLog
Представьте себя на месте сайта Reddit. Когда пользователь публикует ссылку, нужно проверить, публиковалась ли эта ссылка ранее. Истории, которые еще не публиковались, считаются более ценными.
Или представьте себя на месте поискового бота Google. Обрабатывать вебстраницу нужно только в том случае, если она еще не обрабатывалась ранее. Итак, нужно проверить, обрабатывалась ли страница ранее.
Или представьте себя на месте bit.ly — сервиса сокращения URL. Пользователи не должны перенаправляться на вредоносные сайты. У вас имеется набор URL-адресов, которые считаются вредоносными. Теперь нужно выяснить, не направляется ли пользователь на URL-адрес из этого набора.
Во всех этих примерах возникает одна проблема. Имеется очень большой набор данных.
Появляется новый объект, и вы хотите узнать, содержится ли он в существующем наборе. Эта задача быстро решается при помощи хеша. Например, представьте, что Google создает большой хеш, ключами которого являются все обработанные страницы.
Do'stlaringiz bilan baham: |