我非常感谢您有时间阅读本文。
我有一个超大的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
答案 0 :(得分:1)
正如themel指出的那样,R在读取csv文件时非常慢 如果你有sqlite,它确实是最好的方法,因为看起来数据挖掘不仅仅是为了 一次,但在多个会话中,以多种方式。
让我们看看我们的选项
与用C语言编写的工具(在我的机器上)相比,在R中执行此操作的速度慢20倍
这很慢
read.csv( file='filename.csv' , head=TRUE , sep=",")
不是很好,但它应该可以工作(我从来没有尝试过30 gig文件,所以我不能肯定地说)
使用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")
会加载您的数据
来自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)
如果您没有包裹,请从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。