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

我正在阅读大约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?

最佳答案 你的第一个问题

there is a way to output the DataModel to another file so that I could
just read it in instead of having to create it every time?

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

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

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

你的第二个问题

If that is possible then is it possible to output the data from the
ItemSimilarity to another file and just read that in instead of
creating the DataModel and calculating the ItemSimilarity every time?

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

在不了解您的计划的情况下,无法提供最佳选择.它是用于生产,研究还是仅仅是搞乱.首先尝试序列化,但请注意在db或序列化中与磁盘的任何交互都很慢.

希望有所帮助.

点赞