【发布时间】:2014-04-08 08:53:19
【问题描述】:
我编写了一个程序来计算一组 200 万个文档之间的相似性。该程序有效,但我无法存储结果。我不需要经常访问结果,但偶尔需要查询它们并提取子集进行分析。输出基本上是这样的:
1,2,0.35
1,3,0.42
1,4,0.99
1,5,0.04
1,6,0.45
1,7,0.38
1,8,0.22
1,9,0.76
.
.
.
第 1 列和第 2 列是文档 ID,第 3 列是相似度分数。由于相似度分数是对称的,我不需要全部计算它们,但这仍然给我留下 2000000*(2000000-1)/2 ≈ 2,000,000,000,000 行记录。
包含 100 万行记录的文本文件已经是 9MB。推断,这意味着我需要 17 TB 来存储这样的结果(在纯文本文件中)。
有没有更有效的方法来存储这些类型的数据?我可以为每个文档设置一行,并去掉第一列中重复的文档 ID。但这只会到此为止。文件格式或特殊的数据库系统呢?这一定是“大数据”中的通病;我看过报告类似分析的论文/博客,但没有人讨论存储等实际维度。
【问题讨论】:
-
您对与其他人更相似的文档感兴趣吗?您能否仅通过保存相似度得分高于 0.50(或类似的值)的记录来获得相同的结果?换句话说,有没有另一种看待问题的方法?
-
我已经尝试了一些类似的技巧来减少列表,它有点帮助。但我仍然对如何存储这样的大量数据这一更普遍的问题感兴趣,尤其是当它具有非常简单的结构时。
-
压缩可能会在所需空间方面有所帮助。取决于您使用的数据库。这涵盖了 Oracle dbaora.com/table-compression-in-oracle-11g 的一些基本语法因为您将比较结果存储在数据库中,并且没有以任何方式使用数据库进行比较,所以我真的看不出有任何方法可以存储所有它。压缩至少会减少数据占用的空间。
-
我认为你可以使用 unsigned short (2B) 而不是 double (8B) 作为相似部分,因为它在 0.0 和 1.0 之间,我认为你使用 0.01 精度,将它们定义在 0 和100.
-
您真的需要存储这么多信息吗?实际上,您甚至可以在太阳去世(或小熊队赢得世界大赛)之前比较所有这些文件吗?存储有用的信息,而不是即时比较两个感兴趣的文档吗?有时,人们开始着手这些项目,并完全沉浸在技术细节中,而不看大局。也许您可以为每个文件存储一行“摘要”,并使用它来决定对哪些进行详细比较。
标签: sql performance csv bigdata