Как ускорить систему Рекомендоров на основе предметов Mahout?

Я читаю около 7 миллионов строк данных, и это занимает около двух минут, чтобы загрузить все, когда я перезапускаю свое приложение. Я пытаюсь найти лучший способ ускорить процесс, чтобы перезапуск приложения занимал не более нескольких секунд. Вот код, который я ищу, чтобы ускорить и количество времени, которое в настоящее время это занимает:

// Creating data model - this takes about 1.77 minutes
DataModel datamodel = new FileDataModel(new File("datafile"));

// ItemSimilarity object - this takes about 1 millisecond
ItemSimilarity similarity = new TanimotoCoefficientSimilarity(datamodel);

// Recommender - this takes about 3 milliseconds
ItemBasedRecommender irecommender = new GenericBooleanPrefItemBasedRecommender(datamodel, similarity);

// List of Recommendations - this takes about 365 milliseconds
List<RecommendedItem> irecommendations = irecommender.mostSimilarItems(item, amount);

Мне интересно, если:

  • есть способ вывести DataModel в другой файл, чтобы я мог просто прочитать его вместо того, чтобы создавать его каждый раз?
  • Если это возможно, то возможно ли вывести данные из ItemSimilarity в другой файл и просто прочитать это вместо создания DataModel и вычисление ItemSimilarity каждый раз?

1 ответ

Ваш первый вопрос

Есть ли способ вывести DataModel в другой файл, чтобы я мог просто прочитать его вместо того, чтобы создавать его каждый раз?

Да, вы могли бы сериализовать это. НО знать о потенциальных проблемах с сериализацией (см. http://www.ibm.com/developerworks/library/j-5things1/). Вы можете обнаружить, что есть некоторые улучшения скорости, но они могут быть не такими существенными, как вы думаете.

Другой вариант - создать базу данных для хранения данных, которые вы хотите загрузить. После того, как вы сохранили данные, вы можете просто загрузить их в память при запуске проекта. Используя этот подход, вы увидите, что первый запуск вашего приложения будет медленным (поскольку ваша функция берет данные из базы данных и сохраняет их в памяти). Каждая операция с данными будет быстрой, поскольку она находится в памяти.

Вы можете использовать базу данных в памяти, такую ​​как HSQLDB, реляционную базу данных или объектную базу данных - что вам всегда нравится. Я бы, вероятно, посмотрел на объектную базу данных - вы могли бы загружать объекты прямо в память, что могло бы быть быстрее, чем данные в реляционной базе данных, поскольку при создании вам пришлось бы отображать каждое отдельное поле в переменную объекта.

Ваш второй вопрос

Если это возможно, то возможно ли вывести данные из ItemS Similarity в другой файл и просто прочитать их, вместо того, чтобы создавать DataModel и каждый раз вычислять ItemS Similarity?

Вы также можете сериализовать это тоже. Опять же, вы должны быть осторожны при использовании сериализации для сохранения данных. Также стоит подумать о сохранении этого в базе данных, а затем загрузить его в память при первом запуске вашей программы.

Не могу дать лучший вариант, не зная больше о вашей программе. Это для производства, исследований или просто возиться. Сначала попробуйте сериализацию, но обратите внимание, что любое взаимодействие с диском в db или сериализации происходит медленно.

Надеюсь, это поможет.

Другие вопросы по тегам