这篇博客文章介绍了使用Revolution R Enterprise 7.0
和Revolution's R
用于HPA计算Revolution's R
软件包RevoScaleR
进行R中的大数据计算的技巧,这由Revolution Analytics博客介绍。 有关更多详细信息,您可以查看R中的使用大数据进行计算的技巧 。
1升级硬件
由于越大越好,因此增加内存并添加R可以使用的尽可能多的内核非常有帮助。 还试图避免出现在磁盘I / O和RAM速度方面的瓶颈,从而使用更多的内核。
2升级软件
由于R允许替换其核心数学库,因此可以提高使用计算线性代数算法的任何函数的性能。 英特尔数学内核库中的Revolution R Enterprise
链接。
3最小化数据副本
R做了很多自动复制。 例如,当将数据帧传递到函数中时,如果修改了数据帧,则会生成数据副本,并且将数据帧放入列表中也会自动导致生成副本。 此外,随着计算的进行,许多基本分析算法(例如lm
和glm
产生数据集的多个副本。 内存管理很重要。
4分块处理数据
一次处理一块数据可以在不增加内存需求的情况下扩展计算。 有几个CRAN
软件包,包括biglm
, bigmemory
, ff
和ffbase
,它们可以实现外部存储器算法或帮助编写它们。 Revolution R Enterprise's RevoScaleR
软件包通过自动利用计算资源来并行运行其算法,从而将分块算法提高到了新的水平。
5跨内核或节点并行计算
为了将计算扩展到大数据,foreach的CRAN包提供了易于使用的工具,可在一台计算机或多台计算机上并行执行R函数。 foreach()
函数对于不涉及不同任务之间通信的“令人尴尬的并行”计算特别有用。
RevoScaleR
软件包中的统计功能和机器学习算法都是并行外部存储器算法(PEMA)。 它们自动利用计算机或群集(包括LSF和Hadoop群集)上可用的所有内核。
6利用整数
在R中,“连续”数据的两个选择是数字,即8字节(双精度)浮点数和整数,即4字节整数。 在某些情况下,存储和处理整数数据可以使用较少的内存并减少处理时间来提供双重优势。 例如,使用整数时,制表通常比排序快得多,并且可以为所有经验分位数提供准确的值。 即使当您不使用整数时,缩放并转换为整数也可以快速准确地估算分位数。 例如,如果数据由0到1,000范围内的浮点值组成,则转换为整数并进行制表将把中位数或任何其他分位数限制在两个相邻的整数内。 然后插值可以使您更加接近。
7有效地存储数据
当必须从磁盘有效访问大数据时,应使用适当的数据类型,以节省存储空间和访问时间。 尽可能使用整数,而不要使用双精度数和浮点数,因为它们可以表示7个十进制数字的精度,这对大多数数据来说已经足够了,并且占用了双精度数的一半空间。 保存用于计算的64位双精度。
8只读取所需的数据
从磁盘读取计算和分析所需的变量,而不是读取整个变量数据集可以大大加快分析速度。
9转换数据时避免循环
与通常用C,C ++或Fortran编写的R的核心向量操作相比,R中的循环可能非常慢。因此,应避免使用它们。
10将C,C ++或Fortran用于关键功能
由于R可以轻松地与其他语言(包括C,C ++和Fortran)集成,因此可以将R数据对象传递给其他语言,进行一些计算,然后将结果返回到R数据对象中。 因此,R的这种功能可用于关键功能。 例如, CRAN
软件包Rcpp
使从R调用C和C ++代码变得容易。
11批量处理数据转换
为了避免对大型数据集进行多次传递的开销,请编写将所有转换应用于每个块的块化算法。 RevoScaleR
的rxDataStep()
函数通过允许对每个块执行多次数据转换而设计用于一次通过处理。
12可能的面向用户行的数据转换
在编写分块算法时,请尽量避免跨越块边界的算法。 通常,单行数据的数据转换不应依赖于其他行中的值。 关键思想是,即使一次只有几行数据在内存中,转换表达式也应给出相同的结果。 可以进行需要滞后的数据处理,但需要特殊处理。
13有效并谨慎处理分类变量
在大数据集中使用分类变量或因子变量可能会遇到挑战。 例如,在数据块的转换中使用R的factor()
函数而未明确指定整个数据集中存在的所有级别,可能会导致块与块之间的因子级别不兼容。 同样,使用具有数百个级别的因子构建模型可能会导致创建数百个虚拟变量,这些虚拟变量确实消耗了内存。 RevoScaleR
软件包中处理因子的函数可最大程度地减少内存使用,并且通常不会显式创建表示变量的虚拟变量。
14注意0utput与输入的行数相同
当输出具有与数据相同的行数时,例如,在计算预测和残差时,应将输出写到文件中而不是保存在内存中。
15排序前三思
由于排序是一项耗时的操作,因此我们应该使用避免这种排序的算法。 在R中, RevoScaleR
函数rxDTree()
通过使用数据的直方图而不是原始数据本身来避免排序。
翻译自: https://www.javacodegeeks.com/2014/01/big-data-and-r.html