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中可扩展数据处理的知识,这对于数据科学而言非常重要。