【问题标题】:Big Data Process and Analysis in RR中的大数据处理和分析
【发布时间】:2012-01-10 16:40:36
【问题描述】:

我知道这在 R 中并不是一个新概念,我浏览了高性能和并行计算任务视图。话虽如此,我是从无知的角度问这个问题的,因为我没有接受过计算机科学方面的正式培训并且完全是自学的。

最近我从 Twitter 流 API 收集数据,目前原始 JSON 位于一个 10 GB 的文本文件中。我知道在使用 R 来处理大数据方面已经取得了长足的进步,那么您将如何解决这个问题呢?以下是我希望完成的一些任务:

  1. 读取数据并处理成数据框
  2. 基本描述性分析,包括文本挖掘(常用术语等)
  3. 绘图

是否可以为此完全使用 R,或者我必须编写一些 Python 来解析数据并将其放入数据库中,以便获取足够小的随机样本以适合 R。

简单地说,您可以提供的任何提示或指示将不胜感激。同样,如果您在三年级时描述解决方案,我也不会生气。

提前致谢。

【问题讨论】:

  • 如果考虑创造性和高效的代码变得过于繁琐,您可以尝试将更大的计算机投入到数据中。大约 2 美元/小时,您可以从 Amazon 租用具有 68 GB RAM 的 linux 实例。感谢 Bioconductor 的好人,您可以使用他们的预定义 AMI 和已安装的 R 的最新版本,甚至可以轻松设置 RStudio Web 界面。详情here
  • 感谢您,我不知道 Bioconductor 的设置,但听说过类似的设置。我挣扎的一件事是如何使用我通过网络连接的外部计算机“更快”处理驻留在我计算机上的数据。此外,这是否允许我在我的机器上使用 R 加载和处理所有 10gb 数据?
  • 当我使用 EC2 时,我已经通过 scp 或类似协议将我的数据“移至云端”。然后数据和代码驻留在同一个位置。所以我的工作流程如下所示:1. 启动 EC2,2. 将数据和代码移动到 EC2,3. 运行模拟,4. 检索上述所有内容并关闭 EC2 实例。我知道您还可以利用 Amazon 的 S3 服务来托管/存储您的数据并与 EC2 进行通信,尽管我还没有需要走这条路。
  • 感谢您对工作流程的大力响应!
  • 更好的解决方案是下载json文件,将其转换为data.frame,插入到MySQL数据库中。这样,您就可以避免创建 10GB 的文件,然后您就可以查询数据库了。

标签: r bigdata


【解决方案1】:

要读取 JSON 文件的块,您可以使用 scan() 函数。看一下 skip 和 nlines 参数。与使用数据库相比,我不确定您将获得多少性能。

【讨论】:

    【解决方案2】:

    如果您需要一次对整个 10GB 文件进行操作,那么我赞同 @Chase 关于获得更大、可能基于云的计算机的观点。

    (Twitter 流 API 返回一个非常丰富的对象:一条 140 个字符的推文可能会占用几 kb 的数据。如果您在 R 之外预处理数据以仅提取您需要的内容,则可能会减少内存开销,例如作为作者姓名和推文文本。)

    另一方面,如果您的分析适合对数据进行分段——例如,您希望首先按作者、日期/时间等对推文进行分组——您可以考虑使用 Hadoop 来驱动 R。

    诚然,Hadoop 会产生一些开销(集群设置和了解底层 MapReduce 模型);但如果你打算做大量的大数据工作,你可能还是希望在你的工具箱中使用 Hadoop。

    几点建议:

    • Parallel R 第 7 章中的一个示例展示了如何设置 R 和 Hadoop 以进行大规模推文分析。该示例使用 RHIPE 包,但这些概念适用于任何 Hadoop/MapReduce 工作。

    • 您还可以通过 AWS/EC2 获得 Hadoop 集群。退房 弹性 MapReduce 对于按需集群,或使用 Whirr 如果您需要对 Hadoop 部署进行更多控制。

    【讨论】:

    • 好答案。只是一个建议:如果您是您引用的作品的作者,最好透露一下。 :)
    • @qethanm 对于符合 HIPPA 的 Hadoop 的免费替代品,您有什么建议吗?我的数据目前在 10^13 范围内,但根据研究问题,我们的最终分析可能只涉及原始数据的一小部分。
    【解决方案3】:

    10GB 的 JSON 用于存储和分析目的相当低效。您可以使用RJSONIO 有效地阅读它。然后,我将创建一个内存映射文件。您可以使用bigmemory(我的最爱)创建不同类型的矩阵(字符、数字等),或将所有内容存储在一个位置,例如使用 HDF5 或 SQL-esque 版本(例如,参见 RSQlite)。

    会更有趣的是数据的行数和列数。

    至于其他基础设施,例如EC2,这很有用,但是准备一个 10GB 内存映射文件并不需要太多的基础设施。我怀疑您只使用了几千万行和几列(超出推文的实际文本)。这可以在笔记本电脑上轻松处理,并有效使用内存映射文件。进行复杂的统计需要更多的硬件,更聪明地使用熟悉的包,和/或尝试一些不熟悉的包。我建议您在达到该阶段时跟进一个更具体的问题。此类工作的第一阶段只是数据规范化、存储和检索。我的答案很简单:内存映射文件。

    【讨论】:

      【解决方案4】:

      有一个名为colbycol 的全新包,可让您从庞大的文本文件中只读取所需的变量:

      http://colbycol.r-forge.r-project.org/

      read.table 函数仍然是 R 中的主要数据导入函数。这个 函数内存效率低,根据一些估计,它 需要三倍于数据集大小的内存才能排序 将其读入 R。

      这种低效率的原因是 R 将 data.frames 存储在 内存作为列(data.frame 不超过等长的列表 向量),而文本文件由多行记录组成。因此,R 的 read.table 需要读取整行,单独处理它们 分解标记并将这些标记转换为面向列的 数据结构。

      ColByCol 方法具有内存效率。使用 Java 代码,tt 读取 输入文本文件并将其输出到多个文本文件中,每个文件都包含 原始数据集的单个列。然后,这些文件是 单独读入 R 从而避免 R 的内存瓶颈。

      该方法最适合分成多列的大文件, 特别是当这些列可以转换为内存高效时 类型和数据结构:数字的 R 表示(在某些 例),并且通过因子具有重复级别的字符向量占据 比它们的字符表示空间少得多。

      包 ColByCol 已成功用于读取多 GB 数据集 在 2GB 笔记本电脑上。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-24
        相关资源
        最近更新 更多