Тестовая реализация алгоритма MapReduce для подсчёта количества ссылок.
Код не претендует на абсолютную правильность, я точно знаю несколько мест, которые можно упростить
# -*- coding: utf-8 -*-
# (c) 2011 Ruslan Popov
import sys, random, json, cStringIO, cProfile
URLS_TOTAL = 1000000
URLS_IN_FILE = URLS_TOTAL / 100
url_variants = ['yandex.ru', 'rambler.ru', 'yahoo.com', 'google.com',
'twitter.com', 'facebook.com', 'odnoklassniki.ru',]
random.shuffle(url_variants)
def url_generator(limit=1):
""" Итератор, генерирующий требуемое количество URL. """
i = 0
while i value: # если сохранённое значение больше текущего, то взять текущее
r_val = value; r_tck = ticks; r_idx = [index]
return r_val, r_tck, r_idx
def token2dict(token_list):
""" Преобразуем список токенов в словарь, где ключом является вес. """
out = {}
for url, weight in token_list:
index = weight[0]
if index in out:
out[index] = out[index] + [url]
else:
out[index] = [url]
return out
io_pool = [] # список буферов
io_iter = {} # список итераторов для чтения из буферов
cache = {} # кэш для значений, полученных из буферов
def main():
print 'Total URLs:', URLS_TOTAL
print 'Per file:', URLS_IN_FILE
# разбили данные по блокам в отдельных файлах
for i in xrange(URLS_TOTAL/URLS_IN_FILE):
items = sorted(merging(map(mapping, url_generator(URLS_IN_FILE))), key=lambda x: x[0])
save(items)
#raw_input('press enter')
index = xrange(len(io_pool))
result = []
while True:
try:
value, ticks, index = get_value(index)
result.append((value, ticks))
except StopIteration:
result = map(reducing, result)
break
x = token2dict(result)
print
for i in sorted(x.keys())[:3]:
for url in x[i]:
print i*-1, ':', url
cProfile.run('main()')
sys.exit(0)