我知道这不是R中的任何新概念,我浏览了高性能和并行计算任务视图。话虽如此,我从无知的角度提出这个问题,因为我没有正式的计算机科学培训,完全是自学成才。
最近我从Twitter Streaming API收集数据,目前原始JSON位于10 GB文本文件中。我知道在调整R来处理大数据方面取得了很大进展,那么你将如何解决这个问题呢?以下是我要做的一些任务:
是否有可能完全使用R,或者我必须编写一些Python来解析数据并将其放入数据库中,以便随机抽取小到足以适合R的样本。
简单地说,您可以提供的任何提示或指示将不胜感激。如果你描述三年级的解决方案,我也不会冒犯。
提前致谢。
答案 0 :(得分:11)
如果您需要同时操作整个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部署。
答案 1 :(得分:5)
有一个名为colbycol
的全新软件包,可让您只从大量文本文件中读取所需的变量:
http://colbycol.r-forge.r-project.org/
read.table函数仍然是R中的主要数据导入函数 功能是内存效率低下的,根据一些估计,它 需要三倍于数据集大小的内存 将其读入R。
这种低效率的原因是R存储了data.frames 内存为列(data.frame不超过等长的列表 矢量)而文本文件由记录行组成。因此,R's read.table需要读取整行,单独处理它们 分解代币并将这些代币转换为面向列的代币 数据结构。
ColByCol方法具有内存效率。使用Java代码,tt读取 输入文本文件并将其输出到几个文本文件中,每个文件都保存 原始数据集的单个列。然后,这些文件是 单独读入R,从而避免R的内存瓶颈。
该方法最适用于分为多列的大文件, 特别是当这些列可以转换成内存有效时 类型和数据结构:数字的R表示(在某些情况下) 通过因子占用重复级别的特征向量) 比他们的角色表现更少的空间。
包ColByCol已成功用于读取多GB数据集 在2GB笔记本电脑上。
答案 2 :(得分:2)
10GB的JSON在存储和分析方面效率很低。您可以使用RJSONIO
有效地阅读它。然后,我将创建一个内存映射文件。您可以使用bigmemory
(我最喜欢的)创建不同类型的矩阵(字符,数字等),或将所有内容存储在一个位置,例如使用HDF5或SQL-esque版本(例如参见RSQlite)。
更有趣的是数据行数和列数。
至于其他基础设施,例如EC2,这很有用,但准备10GB内存映射文件并不需要太多基础设施。我怀疑你只使用了几十万行和几列(超出Tweet的实际文本)。这可以通过有效使用内存映射文件在笔记本电脑上轻松处理。进行复杂的统计需要更多的硬件,更熟悉的软件包,和/或尝试一些不熟悉的软件包。当你到达那个阶段时,我建议你跟进一个更具体的问题。这种工作的第一阶段只是数据规范化,存储和检索。我的答案很简单:内存映射文件。
答案 3 :(得分:0)
要读取JSON文件的块,可以使用scan()函数。看看skip和nlines参数。我不确定与使用数据库相比你会获得多少性能。