5

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

我有一个包含 600 万条记录和 3000 个(主要是分类数据)列的 csv 格式的超大 30GB 文件。我想为多项回归引导子样本,但即使我的机器中有 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   

尤达

4

2 回答 2

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的代码来阅读和write 和http://sourceforge.net/projects/libcs​​v
/ (过去已经完成。但是我没有使用它,所以我不知道它的性能如何)

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

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

会加载你的数据

直接使用mysql导入csv数据(不好用,不过懂SQL也不错)

从 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 控制台播放,使用RMySQLR 接口访问 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(推荐)

如果您没有软件包,请从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,我会推荐 library(sqldf) 选项:-)

于 2012-08-17T19:57:19.700 回答
0

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

只需导入一次,无需将整个内容加载到内存中,因为可以直接将 CSV文件导入 sqlite。

如果通常您想使用大于内存的数据集,您可能还想看看bigmemory

于 2012-08-16T14:23:35.887 回答