我正在阅读大约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
? 答案 0 :(得分:2)
你的第一个问题
有一种方法可以将DataModel输出到另一个文件,以便我可以 只是读它而不是每次都要创建它?
是的,你可以序列化它。但要注意序列化的潜在问题(参见http://www.ibm.com/developerworks/library/j-5things1/)。您可能会发现速度有所提升,但它们可能没有您想象的那么引人注目。
另一种选择是创建一个数据库来存储要加载的数据。存储数据后,只需在启动项目时将其加载到内存中即可。使用这种方法,您会看到应用程序的第一次运行速度很慢(因为您的函数从数据库中获取数据并将其存储在内存中)。因此,对数据的每个操作都会很快,因为它在内存中。
您可以使用内存中的数据库,例如HSQLDB,关系数据库或对象数据库 - 这是您满意的。我可能会看一个对象db - 你可以将对象直接加载到内存中,这可能比在关系数据库中拥有数据更快,因为你必须在创建时将每个单独的字段映射到对象变量中。
你的第二个问题
如果可以,那么可以从中输出数据 ItemSimilarity与另一个文件相关,只是读取而不是 创建DataModel并每次计算ItemSimilarity?
您也可以将其序列化。再次使用序列化来保存数据时需要小心。还值得考虑将其保存到数据库中,然后在程序首次启动时将其加载到内存中。
如果不了解有关您的计划的更多信息,则无法提供最佳选择。它是用于生产,研究还是仅仅是搞乱。首先尝试序列化,但请注意在db或序列化中与磁盘的任何交互都很慢。
希望有所帮助。