打印在网络论坛上发布大量问题和大量答案的前 10 位用户
Posted
技术标签:
【中文标题】打印在网络论坛上发布大量问题和大量答案的前 10 位用户【英文标题】:Print top 10 users who post lots of questions and lots of answers of a Web Forum 【发布时间】:2014-02-27 00:03:45 【问题描述】:我想比较在网络论坛中发布大量问题与大量答案的人。我需要打印出前 10 个提出问题和回答问题的用户。我编写了一个生成列表的脚本。但它耗时太长,占用内存过多,效率低下。
我写的代码是使用 HashMap。用户和帖子的 .xml 文件非常大。实际数据约为 5-6 GB。
我需要知道提高时间、效率和绩效的最佳方法。
【问题讨论】:
【参考方案1】:有几种方法:
1) 不时更新:你不显示“实际”价值,你不时计算它(即使每月一次,如果它足以实现你的目标)并存储结果。你只显示结果。
2) 使用冗余结构 :您将相同的信息存储了两次但不同,因为每个信息都可以帮助您快速找到其他信息。例如,如果您经常想显示论坛中所有帖子的总和,并且不想逐个统计,则可以有一个额外的列,每当添加新帖子时都会更新该列,以存储帖子总数。
请注意,您必须小心,因为它可能导致数据不一致,如果您做错了什么(但只要您将冗余结构仅用于一些花哨的业务,例如显示 TOP 5,它就是没问题)
【讨论】:
我已经有数据了..如果我现在再创建一个列,我仍然需要遍历整个数据..如果我使用HashMap,5-6GB的数据会进入内存并变慢将减少时间的处理..我不希望这种情况发生..【参考方案2】:您要使用的是重击算法。很酷。这是一种一次性算法;并且可以实时更新或之后完成。
每次用户提出问题或发布答案时,您都会通知数据结构,该数据结构会跟踪前 k 个“重量级人物”。当某个用户退出前 k 名时,它确实变得有点模糊。
这里有一些资源:
the research paper 描述这个想法 a blog post - 谷歌上的“重击者算法”的第一次点击【讨论】:
我正在考虑创建与我的内核数 (8) 相等的线程。每个线程将处理固定的块大小(例如 512 KB)并将答案存储在 HashMap 中。这样,所有数据都不会在内存中,它会节省内存并加快进程。但我不确定我是否可以在 java 中做到这一点。如何在我的核心上运行多个线程?我需要担心这个吗?【参考方案3】:在您的用户表中添加两列:questions_count、answers_count。无需将其全部记入内存,只需浏览每条消息并确定它是问题还是答案,然后更新发布该消息的用户。更新您的论坛软件以在提交消息时进行分析,以便在您完成第一次通过后,论坛将为您更新数据。有了你的两列,就变成了两个简单的查询来获取前十名提问和回答问题的用户。
如果您想了解一下,并跟踪谁在不同时间段内提问和回答(“本周提问的前 10 位是谁?”或“今年谁回答的问题最多?”),那么您将想要创建一个跟踪user_id, message_id, message_type(question|answer), timestamp
的新表。这将允许您通过一个 SQL 调用来回答大多数此类问题。
【讨论】:
以上是关于打印在网络论坛上发布大量问题和大量答案的前 10 位用户的主要内容,如果未能解决你的问题,请参考以下文章