【发布时间】:2014-09-04 12:04:12
【问题描述】:
我有一个由用户使用的应用程序组成的数据集,我正在尝试找出不同应用程序之间的相关性。目前,我有一个与 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 的用户数。为了创建这个矩阵,我想到了首先排序/过滤(使用 Map/Reduce)/聚合(在 MongoDB 中)按用户 ID(O(n)?)的主要未排序数据文件,然后对于每个用户使用的应用程序,有 2 个嵌套循环计算一起安装的应用程序的数量(即获取上述矩阵中的值)。但这太昂贵了 (O(n^3)?) 且不可扩展。
我当然知道多线程和在某个集群上运行程序,但我首先需要一个可扩展且高效的算法/工具(例如,使用动态编程?)。 GNUPlot 在大型数据集中的表现给我留下了深刻的印象,我希望我能达到类似的表现。
我对编程语言的偏好是 Java,但我也考虑过 R(和相关的 HPC 包)和 Bash,虽然我不熟悉 R。我还考虑过“图形数据库”,比如 Neo4J ,但我不确定它们是否适合我手头的问题(不过,我将来需要对我的数据进行图形可视化)。
【问题讨论】:
标签: performance time-complexity large-data