【问题标题】:How can I speed up below program's execution?如何加快程序的执行速度?
【发布时间】:2015-11-09 12:46:29
【问题描述】:

以下是使用 mahout 进行用户推荐的代码。

DataModel dm = new FileDataModel(new File(inputFile));
UserSimilarity sim = new LogLikelihoodSimilarity(dm);
UserNeighborhood neighborhood = new NearestNUserNeighborhood(100, sim,
            dm);
GenericUserBasedRecommender recommender = new GenericUserBasedRecommender(
            dm, neighborhood, sim);

生成建议后,我正在尝试将其写入文件,如下所示:

FileWriter writer = new FileWriter(outputFile);
for (LongPrimitiveIterator userIterator = dm.getItemIDs(); userIterator.hasNext();) {
long user = (long) userIterator.next();
List<RecommendedItem> recs = recommender.recommend(user, numOfRec );
        for (RecommendedItem item : recs) {
            writer.write(user + "," + item.getItemID() + ","
                    + item.getValue()+"\n");
        }
    }
writer.close();

此代码 - 写入文件需要大量时间。如何加快写入操作?

【问题讨论】:

  • 通过使用条件/过滤器等减少 fwriter 必须处理的最终数据量。
  • @TheLaw,你能举个条件/过滤器的例子吗?
  • 不要将String+ 串联使用,而是使用不同的write 调用。
  • 我投票结束这个问题,因为它属于codereview.stackexchange.com
  • @JordiCastilla,我将问题移至代码审查部分。

标签: java apache file mahout mahout-recommender


【解决方案1】:

我认为您可以进行的潜在改进很少:

  1. 使用 BufferedWriter 而不是普通的 writer。它应该可以为您提供 30% 左右的安全性,但只是在简单的写作时间内。 100k 行应该在几百毫秒左右。

    Writer writer = new BufferedWriter(new FileWriter(outputFile));
    
  2. Write 建议在两个单独的线程中处理和写入文件,一个线程不必等待另一个线程。

  3. 扩展点2,可以尝试将推荐处理打包到ThreadPoolExecutor。现在,您的代码只有一个线程,并且大多数当前处理器的内核数量远远超过可用于此目的的数量。如果您需要更多信息,请告诉我。

【讨论】:

  • 我尝试过使用 BufferedWriter,但没有成功。我正在尝试并行线程,如果成功将更新。
  • 这里写不成问题。在我的笔记本电脑上写 100k 行大约需要 100 毫秒。您需要优化推荐器的处理。尝试使用池执行器。
  • 感谢马雷克的帮助。正如你所说,我可以在一分钟内将垃圾信息写入 1000K 的文件。我正在尝试使用并行线程,如果成功会返回。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多