我有一个由用户使用的应用组成的数据集,我试图找出不同应用之间的相关性。目前,我有一个与200,000个用户和800,000个应用程序相关的数据集(1GB文本文件)。我正在寻找一种有效的方法来构建一个矩阵,该矩阵显示已经安装特定应用程序的用户数量。例如,请考虑以下矩阵:
app1 app2 app3 app4
app1 0 100 300 50
app2 100 0 350 0
app3 300 350 0 70
app4 50 0 70 0
值100表示在手机上同时安装app1和app2的用户数。为了创建这个矩阵,我想到第一个用userID(O(n)?)排序/过滤(使用Map / Reduce)/聚合(在MongoDB中)主要的未排序数据文件,然后是每个用户使用的应用程序,有2个嵌套循环计算一起安装的应用程序数量(即获取上述矩阵中的值)。但这是如此昂贵( O(n ^ 3)?)并且不可扩展。
当然,我是关于多线程并在某个集群上运行程序的,但我首先需要一个可扩展且高效的算法/工具(例如使用动态编程?)。我对大型数据集中GNUPlot的性能印象深刻,我希望能够达到类似的性能。
我对编程语言的偏好是Java,但我也考虑过R(和相关的HPC包)以及Bash,虽然我不熟悉R.我也想过&#34 ;图形数据库",像Neo4J,但我不确定它们是否适合我手头的问题(我将来需要对数据进行图形可视化)。
答案 0 :(得分:2)
你有没有想过要做什么?
有80万个应用。 800000 x 800000矩阵将占用近5 TB的存储空间。虽然这对现代硬盘很有用,但肯定你可以更好地处理所有存储。
最好为每个应用程序存储已安装应用程序的用户的排序列表。通过这种方式,您可以使用集交集算法来隐式地快速计算矩阵的条目。
您需要更具体地说明您将对此数据下游做些什么,以获得有关如何表示它的建议。