【问题标题】:efficient solution for dealing with huge datasets处理庞大数据集的有效解决方案
【发布时间】: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


    【解决方案1】:

    你想过你要做什么吗?

    有 800000 个应用程序。一个 800000 x 800000 矩阵将占用将近 5 TB 的存储空间。虽然这对于现代硬盘来说是很可行的,但肯定你可以更好地处理所有这些存储。

    最好为每个应用存储用户安装了该应用的排序列表。这样,您可以使用集合交集算法以相当快的速度隐式计算矩阵的条目。

    您需要更具体地了解您将如何处理这些下游数据,以便获得有关如何表示它的建议。

    【讨论】:

    • 感谢您的建议。我正在考虑使用存储稀疏矩阵(如“坐标”)的技术来存储生成的矩阵,以节省磁盘空间(因为每个用户通常最多安装约 200 个应用程序)。我的最终目的是(给定应用程序名称)指定应用程序是否属于某种类型,方法是检查与它一起安装的应用程序是否属于该特定类型。每个应用都将标有布尔字段/属性,例如“isTypeX”。
    • @Metallica:它可能不是很稀疏。当 A 稀疏时,A A^T 通常不是。
    • 如果您的阈值是 1000,则对 10% 的用户进行抽样并检查至少出现 50 次的所有对(使用 Chernoff 界限)除了 2.17 * 10^-7 的一小部分之外所需的应用程序对。这比错过某一双的几率要高出四百万分之一。
    • 另外,当然,它是 O(n^3)。但是,当您开始编程时,最好的办法是忘记这些界限,因为它们通常依赖于参数(如此处的 n),这些参数没有足够详细地描述输入以准确估计程序的复杂性。更好的指标是您正在查看的(用户、应用程序)对的数量。我给出的方法所花费的时间与每个用户总是安装的应用程序数量的平方和成正比。
    • @Metallica:好的,所以您正在尝试从数据集中提取一种暗示图。 (请注意,此信息是必不可少的,但在您的问题中无处。)我会在更流行的应用程序上进行随机抽样(在这里您会丢失很少的信息)和蛮力不太受欢迎的应用程序(这不会花费太长时间,因为您已经大大减少了数据)。 “协同过滤”是基于寻找特征矩阵的低秩近似;人们似乎对它的输出感到满意。不过,从形式上讲,它解决了一个稍微不同的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 2022-11-08
    相关资源
    最近更新 更多