大数据读取子样本R.

时间:2012-08-16 13:49:30

标签: linux r awk system statistics-bootstrap

我非常感谢您有时间阅读本文。

我有一个超大的30GB文件,包含600万条记录和3000条(主要是分类数据)的csv格式列。我想引导用于多项式回归的子样本,但即使我的机器中使用64GB RAM并且交换文件的两倍,它也很难实现,这个过程变得非常缓慢并停止。

我正在考虑在R中生成子样本指标并使用sed或awk将它们输入系统命令,但不知道如何执行此操作。如果有人知道使用R命令干净的方法,我会非常感激。

一个问题是我需要选择子样本的完整观察,即我需要拥有特定多项观察的所有行 - 它们从观察到观察的长度不同。我计划使用glmnet然后进行一些花哨的变换来得到多项式的近似值。另一点是我不知道如何选择样本大小以适应内存限制。

非常感谢你的想法。

R.version
platform       x86_64-pc-linux-gnu          
arch           x86_64                       
os             linux-gnu                    
system         x86_64, linux-gnu            
status                                      
major          2                            
minor          15.1                         
year           2012                         
month          06                           
day            22                           
svn rev        59600                        
language       R                            
version.string R version 2.15.1 (2012-06-22)
nickname       Roasted Marshmallows   
尤达

2 个答案:

答案 0 :(得分:1)

正如themel指出的那样,R在读取csv文件时非常慢 如果你有sqlite,它确实是最好的方法,因为看起来数据挖掘不仅仅是为了 一次,但在多个会话中,以多种方式。

让我们看看我们的选项

将csv读取到R(慢)

与用C语言编写的工具(在我的机器上)相比,在R中执行此操作的速度慢20倍

这很慢

read.csv( file='filename.csv' , head=TRUE , sep=",")

事先转换为stata dta文件并从那里加载

不是很好,但它应该可以工作(我从来没有尝试过30 gig文件,所以我不能肯定地说)

编写程序将csv转换为dta格式(如果你知道你在做什么)

使用http://www.stata.com/help.cgi?dta中的资源 以及来自https://svn.r-project.org/R-packages/trunk/foreign/src/stataread.c的代码来读写 和http://sourceforge.net/projects/libcsv/
(它已经在过去完成了。但是我没有使用它,所以我不知道它的表现如何)

然后使用foreign包(http://cran.r-project.org/web/packages/foreign/index.html),一个简单的

library(foreign)
whatever <- read.dta("file.dta")

会加载您的数据

直接使用mysql导入csv数据(难以使用,但如果你知道SQL,那就没那么糟了)

来自s SQL控制台

LOAD DATA LOCAL INFILE 'file.csv' INTO TABLE my_table 
IGNORE 1 LINES              <- If csv file contains headers
FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\' LINES TERMINATED BY '\n'

或者

mysql -e "LOAD DATA INFILE 'ls.dat' INTO TABLE mytable1" mydatabase

然后从R控制台播放,使用RMySQL R接口连接MySQL数据库 http://cran.r-project.org/web/packages/RMySQL/index.html

install.packages('RMySQL')

然后像

一样玩
mydb = dbConnect(MySQL(), user=username, password=userpass, dbname=databasename, host=host)
dbListTables(mydb)
record <- dbSendQuery(mydb, "select * from whatever")
dbClearResult(rs)
dbDisconnect(mydb)

使用R来执行所有sqlite / postgreSQL / MySQL后端SQL的东西来导入csv(Reccomended)

如果您没有包裹,请从https://code.google.com/p/sqldf/下载 或svn checkout http://sqldf.googlecode.com/svn/trunk/ sqldf-read-only

从R控制台

install.packages("sqldf")
# shows built in data frames
data() 

# load sqldf into workspace
library(sqldf)
MyCsvFile <- file("file.csv")
Mydataframe <- sqldf("select * from MyCsvFile", dbname = "MyDatabase", file.format = list(header = TRUE, row.names = FALSE))

然后你走了!

Presonally,我会推荐库(sqldf)选项: - )

答案 1 :(得分:0)

我认为使用CSV作为此类文件大小的数据格式是一个非常糟糕的主意 - 为什么不将其转换为SQLite(或“实际”数据库)并使用SQL查询提取子集(使用DBI / {RSQLite {3}})?

您只需导入一次,并且无需将整个内容加载到内存中,因为您可以2将文件导入sqlite。

如果您通常希望使用大于内存的数据集,则可能还需要查看directly import CSV