打印在网络论坛上发布大量问题和大量答案的前 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 位用户的主要内容,如果未能解决你的问题,请参考以下文章

Graphite 显示按时间过滤的前 10 个指标

如何在 Xcode 上打印指南针方向?

在 C 中使用 unsigned char 进行神奇打印

如何横向打印 HTML?

为啥 1+++2 = 3?

centos systemd占用大量内存