2011-03-07 50 views
4

我正在建立一个网站,我想通过共同兴趣匹配人。我这样做,通过计算每个用户之间的权重,并确定谁是最好的比赛 - 那些谁拥有高权重:存储500,000个用户的权重对的最佳方法是什么?

例子:

user 1 with user 2 = weight of 1 
user 1 with user 3 = weight of 10 
user 1 with user 4 = weight of 20 

我想把权重的DB。问题是如果我有500,000个用户,那么它就是500,000 x 500,000个可能的组合,或者125,000,000,000个条目 - 在mysql数据库中。在许多表格中插入如此多的数据是不现实的。

我的问题是:有没有办法处理使用另一种类型的数据库权重配对?我已经阅读了关于矢量和东西的内容,但对这个问题不够了解。

我已签文件有关:

  • NoSQL数据库:MongoDB的
  • 对象数据库(db4o的,Versant公司)
  • 图形数据库:Neo4j的,索恩斯...
  • 偏出立柱:Hadoop的,HBASE
  • Document Store:CouchDB
  • Key Value Store:Redis,Voldemort
  • 网格数据库:Gigaspaces ..
  • XML数据库。

但是,我没有看到一个解决方案。有没有人遇到过这个问题,可以给我一个提示?

+0

存储绝对权重是不是很容易,并且使用SQL查询和/或脚本来找到最近的相对权重? – 2011-03-07 06:20:52

+0

这是一个有趣的问题。我会考虑它... – 2011-03-07 06:47:22

+0

我不认为你会找到一个看NoSQL的东西的答案 – 2011-03-07 06:48:03

回答

1

我要走出一条腿,说对于摆出的问题没有好的解决方案。考虑到所提出的问题,似乎没有办法避免存储125B用户/重量值。

查看另一个数据库类型不会帮助。您根本无法解决您需要存储125B值的事实。

周围有此

  • 几种方法查找用户和权重之间的关系。例如。如果weight总是等于两个用户ID的总和(假设用户有一个ID),那么您不必存储权重。在飞行
  • 计算并没有存储
0

从它似乎是结构代表的网的问题,其中每个用户连接到其他人(500K×(50万-1))。听起来很复杂。做一些启发式的假设,优化可能是可能的。

假设案例1:不是每个用户对都可能有一个权重,这可能会导致一个稀疏矩阵。那么为什么不单独存储非零权重

假设案例2:我有强烈的感觉,权重的范围可能会受到限制。我不认为会有500K不同的权重,可能是500个不同的权重。如果是这种情况,请创建500个不同的组,用于存储用户对。节省空间并不多,而是一种分区方法。

要使用案例2实现节省空间,无需将用户存储在这些组下。汇总感兴趣的特征(下限和上限)。要获取给定用户的匹配,请执行以下操作:

  1. 遍历500个奇数重量组,并获取最合适的下限和上限。你不会知道确切的用户,但你现在知道他/她如何映射。
  2. 搜索谁在此范围
  3. 属于用户user表中的开展你深入分析由步骤2

我的假设可能是错的返回的实际用户群。我遇到这种情况,只是给了一个射击伙伴。

0

只要您的设计涉及存储所有组合的所有权重,就无法避免存储问题。只有通过优化设计本身才能实现合理的空间优化。下面的questzen暗示了一些好的方法。稀疏矩阵方法最初可能起作用,但随着越来越多的用户连接起来,它可能会变得无用。例如,识别重量的固定桶(范围)而不是绝对重量值会更好。

或者,看看你是否可以放弃完全连接的网状拓扑结构,并采用类似稀疏连接的集群或层次结构等。如果是这样,那么每个这样的集群可以被赋予一个标识符,并且可以为每个用户使用他/她自己的群集(一定程度的归属)以及群集到群集连接的权重。然后可以根据群集间权重和用户对其自己群集的“归属度”来导出从群集1中的用户1到群集2中的用户-2的连接的权重。

0

我认为这是一个非常简单而有趣的问题,特别是如果你不能使用任何技巧来减少存储的权重数量。最终,您拥有键值对,其中的密钥由成对用户构成。只要您只想在给定的用户对时检索单个权重,就可以使用分片。

如果您的数据没有经常更改,并且您有多台计算机可以使用,那么您应该能够实施自己的简单分片策略或使用Gizzard来管理每个设备上具有兼容键值数据存储的简单群集电脑。 (Gizzard要求所有操作都是可交换和幂等的。)

0

您是否愿意从头开始构建解决方案?
如果你愿意,也许你应该创建500000个文件,每个用户一个,并在每个文件中存储500000个权重,按照用户ID排序,长度固定。然后,您可以到您需要的文件中的特定位置并读取该值,而无需使用分隔符或实际存储用户标识符。 (如果您的用户ID不是1-500000的数字,您还需要从用户ID到1-500000的新ID的映射,并且您将按此ID排序)

您是什么样的粒度需要你的体重?
您可以将每个重量四舍五入到n /(2^k)的最接近倍数,以满足您的需求。在小数点后3位的情况下,可以将每个数字存储为10位,k = 10。这样每个文件将只有500000 * 10bits = 625Kb,整个数据集将是312.5Gb。你甚至可以压缩这些文件,只在需要时解压缩它们,当然这取决于你愿意在速度和空间之间做出的折衷。此解决方案还假定很少进行更改,并且您只一次检索一个值(或某种值的范围)。

1

从你的解释我不认为应该存储这些权重。它们就是你已经完成的一些计算的缓存。您不需要存储结果,因为您可以在需要时重复计算。您仍然可以存储您的权重,但只是记住它是缓存,并且缓存变满时其中的数据可以删除。

顺便说一句,用户通常有过滤器。这些过滤器可能会自动忽略95%的用户群。你可以使用它来你的优势。

-1

在我看来,问题不存在。由于一个人知道50万人是不现实的。可能有500,000人知道一个人,但这个人大概只知道他们中的一小部分人,例如, Lady Gaga

在整个生活中,社交网络的现实平均值可能是300。所以你们“只有”1亿至2亿的关系。

我会去图形数据库,因为使用它们很容易建模关系。

相关问题