如何加快Mahout基于项目的推荐系统?

时间:2015-06-29 19:04:56

标签: mahout recommendation-engine mahout-recommender

我正在阅读大约700万行数据,当我重新启动应用程序时,加载所有内容需要将近两分钟。我正在尝试找出加快速度的最佳方法,以便最多只需几秒钟即可重新启动应用程序。以下是我希望加快的代码和当前所需的时间:

// 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 个答案:

答案 0 :(得分:2)

你的第一个问题

  

有一种方法可以将DataModel输出到另一个文件,以便我可以   只是读它而不是每次都要创建它?

是的,你可以序列化它。但要注意序列化的潜在问题(参见http://www.ibm.com/developerworks/library/j-5things1/)。您可能会发现速度有所提升,但它们可能没有您想象的那么引人注目。

另一种选择是创建一个数据库来存储要加载的数据。存储数据后,只需在启动项目时将其加载到内存中即可。使用这种方法,您会看到应用程序的第一次运行速度很慢(因为您的函数从数据库中获取数据并将其存储在内存中)。因此,对数据的每个操作都会很快,因为它在内存中。

您可以使用内存中的数据库,例如HSQLDB,关系数据库或对象数据库 - 这是您满意的。我可能会看一个对象db - 你可以将对象直接加载到内存中,这可能比在关系数据库中拥有数据更快,因为你必须在创建时将每个单独的字段映射到对象变量中。

你的第二个问题

  

如果可以,那么可以从中输出数据   ItemSimilarity与另一个文件相关,只是读取而不是   创建DataModel并每次计算ItemSimilarity?

您也可以将其序列化。再次使用序列化来保存数据时需要小心。还值得考虑将其保存到数据库中,然后在程序首次启动时将其加载到内存中。

如果不了解有关您的计划的更多信息,则无法提供最佳选择。它是用于生产,研究还是仅仅是搞乱。首先尝试序列化,但请注意在db或序列化中与磁盘的任何交互都很慢。

希望有所帮助。