13

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

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

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

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

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

提前致谢。

4

4 回答 4

11

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

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

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

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

几个指针:

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

  • 您还可以通过 AWS/EC2 获得 Hadoop 集群。查看 Elastic MapReduce 以获取按需集群,或者 如果您需要对 Hadoop 部署进行更多控制,请使用Whirr 。

于 2011-12-02T14:13:14.460 回答
5

有一个全新的包叫做colbycol,它可以让你从巨大的文本文件中只读取你想要的变量:

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

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

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

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

该方法最适用于分成许多列的大文件,特别是当这些列可以转换为内存高效的类型和数据结构时:数字的 R 表示(在某些情况下)和通过因子重复级别的字符向量占用的空间比他们的性格表现。

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

于 2012-04-27T13:51:28.397 回答
2

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

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

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

于 2011-12-05T18:40:46.390 回答
0

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

于 2011-12-01T15:40:40.340 回答