我需要编写一个程序,计算两个用户在同一组中出现的次数。用户通过用户名给出,组通过id给出。
例如,使用以下输入(存储在文本文件中):
我想要结果:
这听起来很琐碎。但问题在于:我有180万个组和30万个用户,以及大量的成员资格(我预计每个用户平均至少有50个成员资格,可能更多)。这意味着需要处理大量数据。
我编写了5个不同的程序来解决这个问题,但都无法减少数据量:作为PostgreSQL查询太慢了。在Java工作内存中运行时内存消耗过大(首先是堆空间,优化后我得到了罕见的“GC超限”错误)。从Java连续写入数据库也太慢了(即使使用批量查询进行优化)。越来越绝望,我尝试了一些更奇特的方法,比如将所有对写入数组,然后排序(O(n log(n))),然后逐渐计数。但仍然需要存储太多数据在内存中。
有没有关于如何解决这个问题的算法?或者说这是不可能的?
john 32
john 21
jim 21
jim 32
bob 32
我想要结果:
john-jim 2
john-bob 1
jim-bob 1
这听起来很琐碎。但问题在于:我有180万个组和30万个用户,以及大量的成员资格(我预计每个用户平均至少有50个成员资格,可能更多)。这意味着需要处理大量数据。
我编写了5个不同的程序来解决这个问题,但都无法减少数据量:作为PostgreSQL查询太慢了。在Java工作内存中运行时内存消耗过大(首先是堆空间,优化后我得到了罕见的“GC超限”错误)。从Java连续写入数据库也太慢了(即使使用批量查询进行优化)。越来越绝望,我尝试了一些更奇特的方法,比如将所有对写入数组,然后排序(O(n log(n))),然后逐渐计数。但仍然需要存储太多数据在内存中。
有没有关于如何解决这个问题的算法?或者说这是不可能的?
text
而不是像user_id
一样的integer
类型吗?另外,(grp, usr)
是唯一的吗?还有,你使用的是哪个版本的Postgres? - Erwin Brandstetter