Я только что посмотрел Пакетную обработку данных в сеансе App Engine в Google I / O 2010 , прочитал некоторые части статьи MapReduce из Google Research и теперь я подумываю использовать MapReduce в Google App Engine для реализации системы рекомендаций на Python.
Я предпочитаю использовать appengine-mapreduce вместо API очереди задач, потому что первый предлагает легкую итерацию по всем экземплярам того или иного типа, автоматическое пакетирование, автоматическое объединение задач и т. Д. Проблема в том, что моя рекомендательная система должна вычислять корреляцию между экземплярами две разные модели, т. е. экземпляры двух разных видов.
Пример:
У меня есть две модели: User и Item. У каждого есть список тегов в качестве атрибута. Ниже приведены функции для расчета корреляции между пользователями и элементами. Обратите внимание, что calculateCorrelation
должен вызываться для каждой комбинации пользователей и элементов:
def calculateCorrelation(user, item):
return calculateCorrelationAverage(u.tags, i.tags)
def calculateCorrelationAverage(tags1, tags2):
correlationSum = 0.0
for (tag1, tag2) in allCombinations(tags1, tags2):
correlationSum += correlation(tag1, tag2)
return correlationSum / (len(tags1) + len(tags2))
def allCombinations(list1, list2):
combinations = []
for x in list1:
for y in list2:
combinations.append((x, y))
return combinations
Но что calculateCorrelation
не является допустимым Mapper в appengine-mapreduce, и, возможно, эта функция даже несовместима с Концепция вычислений MapReduce. Тем не менее, мне нужно быть уверенным ... для меня было бы здорово иметь такие преимущества appengine-mapreduce, такие как автоматическое пакетирование и объединение задач.
Есть ли какое-нибудь решение для этого?
Должен ли я определять свой собственный InputReader? Новый InputReader, который считывает все экземпляры двух разных типов, совместим с текущей реализацией appengine-mapreduce?
Или мне следует попробуйте следующее?