打印发布网络论坛的大量问题和大量答案的前10位用户

时间:2014-02-27 00:03:46

标签: java performance parallel-processing bigdata distributed-system

我希望比较在网络论坛中发布大量问题与大量答案的人。我需要打印出提出问题的前10位用户以及回答问题的用户。我编写了一个生成列表的脚本。但它需要太长时间并且使用太多内存并且效率低下。

我写的代码是使用HashMap。用户和帖子的.xml文件非常大。实际数据约为5-6千兆字节。

我需要知道改善时间,效率和性能的最佳方式。

3 个答案:

答案 0 :(得分:0)

有几种方法:

1)不时更新:您不会显示“实际”值,您不时计算(即使每月一次,如果它足以实现您的目标)并存储结果。您只显示结果。

2)使用冗余结构:您已经存储了两次不同的相同信息,因为每个信息都可以帮助您快速找到其他内容。例如,如果您经常想要在论坛中显示所有帖子的总和而您不想一个一个地计算,那么您可以添加额外的列,每当添加新帖子时会更新该列,其中存储了帖子总数。

请注意,你必须要小心它,因为它可能会导致数据不一致,如果你做错了(但只要你使用冗余结构只是为了一些花哨的商业,比如显示TOP 5,它是好的)

答案 1 :(得分:0)

你想要使用的是重型击球手算法。这很酷。它是一次通过算法;并且可以实时更新或之后完成。

每当用户提出问题或发布答案时,您都会通知数据结构,该结构会跟踪前k个“重击者”。在其中一个用户退出顶部k时,它确实会有点模糊。

以下是一些资源:

答案 2 :(得分:0)

在users表中添加两列:questions_count,answers_count。不要将其全部记入内存,只需浏览每条消息并确定它是问题还是答案,然后更新发布该消息的用户。在提交消息时更新您的论坛软件以进行分析,以便在您完成第一次通过后,论坛将为您更新数据。使用您的两列,它将成为两个简单的查询,以便让前十位用户提出问题并回答问题。

如果你想获得幻想,并追踪谁在不同的时间跨度中询问和回答(“谁是本周排名前10位的问题?”或“谁回答了今年最多的问题?”),那么你将会想要创建一个跟踪user_id, message_id, message_type(question|answer), timestamp的新表。这将允许您通过单个SQL调用回答大多数类型的问题。