R语言中的可扩展数据处理


大多数情况下,R程序员会遇到大量数据,这会导致问题,因为默认情况下变量存储在内存中。R语言在处理超过计算机RAM 10% 的大量数据时效果不佳。但是,如果我们想在数据科学领域取得优异成绩,数据处理应该是可扩展的。因此,我们将讨论如何在数据足够大于计算机RAM时,轻松地应用某些操作并使用可扩展的数据处理。讨论还将重点关注处理“内存外”对象。

什么是可扩展数据处理?

可扩展性在处理大数据时是一个非常重要的方面。众所周知,将数据读写到磁盘比读写到RAM需要更多时间。因此,与RAM相比,从硬盘检索一些数据需要花费大量时间。计算机资源(如RAM、处理器和硬盘驱动器)在决定R代码执行速度方面起着重要作用。我们知道我们无法更改这些资源(除非用新硬件替换它们),但我们可以有效地利用这些资源。

例如,假设我们有一个与RAM大小相同的数据集。可以通过仅加载当前实际需要的数据集部分来降低成本。

处理时间与数据大小之间的关系

处理时间取决于数据集的大小。较大的数据集通常需要更长的时间来处理。但需要注意的是,处理时间与数据集的大小并不成正比。

让我们通过一个例子用简单的语言来理解。假设我们有两个数据集,其中一个数据集是另一个数据集的两倍。因此,处理较大数据集所需的时间不是处理另一个数据集所需时间的两倍。

处理较大数据集所需的时间显然会比较小的数据集多,但我们不能明确地说它会是较小数据集的两倍或三倍等。它完全取决于对数据集元素执行的操作。

R为我们提供了microbenchmark包,可用于比较两个或多个操作的时间。我们还可以使用R中的plot()函数绘制差异。

示例

例如,考虑以下对不同大小的随机数组进行排序的程序:

# Load the microbenchmark package library(microbenchmark) # Time comparison between sorting vectors of # different sizes microbenchmarkObject <- microbenchmark( # Sort a random normal vector length 5e5 "5e5" = sort(rnorm(5e5)), # Sort a random normal vector length 4e5 "4e5" = sort(rnorm(4e5)), # Sort a random normal vector length 3e5 "3e5" = sort(rnorm(3e5)), # Sort a random normal vector length 2e5 "2e5" = sort(rnorm(2e5)), # Sort a random normal vector length 1e6 "1e6" = sort(rnorm(1e6)), times = 15 ) # Plot the resulting benchmark object plot(microbenchmarkObject)

输出

如您在输出中看到的,每次执行时间并不总是相同的。出现这种情况的原因是,当系统正在执行R代码时,其他事情也在幕后进行。

注意,在评估R代码的执行时间时,使用microbenchmark库跟踪操作也是一个好的实践。

使用“内存外”对象

在本节中,我们将讨论big.matrix对象。big.matrix包含R中的一个对象,它或多或少与C++中的数据结构相同。此对象类似于通用R矩阵,但可以防止开发人员遇到通用R矩阵的内存消耗问题。

现在,我们将使用read.big.matrix()函数创建我们自己的big.matrix对象。

该函数也与read.table()非常相似,但它要求我们指定要读取的值的类型,即“char”、“short”、“integer”、“double”。必须给出保存矩阵数据的文件名(后备文件),并且需要文件名来保存有关矩阵的信息(描述符文件)。结果将存储在磁盘上的文件中,该文件保存读取的值,以及一个描述符文件,该文件保存有关生成的big.matrix对象的更多描述。

安装bigmemory库

在继续之前,我们需要安装“bigmemory”库。您可以使用以下命令在CRAN中下载此库:

install.packages("bigmemory")

导入bigmemory

第一步是导入bigmemory库。使用以下命令导入库:

library(bigmemory)

下载文件

现在下载一个示例csv文件“mortgage-sample.csv”:

# Download file using URL
download.file("http://s3.amazonaws.com/assets.datacamp.com/production/course_2399/datasets/mortgage-sample.csv", destfile = "mortgage-sample.csv")

创建big.matrix对象

我们现在将创建一个big.matrix对象。为此,传递的参数将是“mortgage-sample.desc”。可以使用dim()函数提取对象的维度:

示例

# Create an object of object <- read.big.matrix("mortgage-sample.csv", header = TRUE, type = "integer", descriptorfile = "mortgage-sample.desc") # Display the dimensions dim(object)

输出

[1] 70000    16

如您在输出中看到的,big.matrix对象的尺寸已显示。

显示big.matrix对象

要显示前6行,我们可以使用head()函数:

示例

head(object)

输出

     enterprise record_number msa perc_minority
[1,]          1           566   1             1
[2,]          1           116   1             3
[3,]          1           239   1             2
[4,]          1            62   1             2
[5,]          1           106   1             2
[6,]          1           759   1             3
     tract_income_ratio borrower_income_ratio
[1,]                  3                     1
[2,]                  2                     1
[3,]                  2                     3
[4,]                  3                     3
[5,]                  3                     3
[6,]                  3                     2
     loan_purpose federal_guarantee borrower_race
[1,]            2                 4             3
[2,]            2                 4             5
[3,]            8                 4             5
[4,]            2                 4             5
[5,]            2                 4             9
[6,]            2                 4             9
     co_borrower_race borrower_gender
[1,]                9               2
[2,]                9               1
[3,]                5               1
[4,]                9               2
[5,]                9               3
[6,]                9               1
     co_borrower_gender num_units affordability year
[1,]                  4         1             3 2010
[2,]                  4         1             3 2008
[3,]                  2         1             4 2014
[4,]                  4         1             4 2009
[5,]                  4         1             4 2013
[6,]                  2         2             4 2010
     type
[1,]    1
[2,]    1
[3,]    0
[4,]    1
[5,]    1
[6,]    1

创建表格

我们还可以创建一个表格。示例csv文件包含year作为列名,因此我们可以使用以下程序显示抵押贷款数量:

示例

# Create a table for the number # of mortages for each specific year print(table(object[, "year"]))

输出

2008 2009 2010 2011 2012 2013 2014 2015 
6919 8996 7269 6561 8932 8316 4687 5493 

如您在输出中看到的,已显示每年的抵押贷款数量。

数据摘要

现在我们已经了解了如何导入big.matrix对象。我们现在将了解如何分析存储在对象中的数据。R为我们提供了binanalytics包,我们可以使用它来创建摘要。您可以使用以下命令在CRAN中下载biganalytics库:

install.packages("biganalytics")

示例

现在让我们考虑以下显示抵押贷款摘要的程序:

library(biganalytics) # Download file using URL download.file("http://s3.amazonaws.com/assets.datacamp.com/production/course_2399/datasets/mortgage-sample.csv", destfile = "mortgage-sample.csv") # Create an object of object <- read.big.matrix("mortgage-sample.csv", header = TRUE, type = "integer", descriptorfile = "mortgage-sample.desc") # Display the summary summary(object)

输出

enterprise               1.0000000    2.0000000    1.3814571    0.0000000
record_number            0.0000000  999.0000000  499.9080571    0.0000000
msa                      0.0000000    1.0000000    0.8943571    0.0000000
perc_minority            1.0000000    9.0000000    1.9701857    0.0000000
tract_income_ratio       1.0000000    9.0000000    2.3431571    0.0000000
borrower_income_ratio    1.0000000    9.0000000    2.6898857    0.0000000
loan_purpose             1.0000000    9.0000000    3.7670143    0.0000000
federal_guarantee        1.0000000    4.0000000    3.9840857    0.0000000
borrower_race            1.0000000    9.0000000    5.3572429    0.0000000
co_borrower_race         1.0000000    9.0000000    7.0002714    0.0000000
borrower_gender          1.0000000    9.0000000    1.4590714    0.0000000
co_borrower_gender       1.0000000    9.0000000    3.0494857    0.0000000
num_units                1.0000000    4.0000000    1.0398143    0.0000000
affordability            0.0000000    9.0000000    4.2863429    0.0000000
year                  2008.0000000 2015.0000000 2011.2714714    0.0000000
type                     0.0000000    1.0000000    0.5300429    0.0000000

输出显示了通过指定最小值、最大值、平均值和NA值的对象摘要。

结论

在本教程中,我们讨论了R中的可扩展数据处理。我们从处理时间如何与数据大小相关开始。我们了解了“内存外”对象(如big.matrix)的工作原理。我希望通过本教程,您将获得R中可扩展数据处理的知识,这对于数据科学而言非常重要。

更新于: 2023年1月17日

312 次查看

开启您的职业生涯

通过完成课程获得认证

开始学习
广告