Как ускорить систему Рекомендоров на основе предметов 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 или сериализации происходит медленно.
Надеюсь, это поможет.