查看此线程后,我注意到没有提到此问题的明显解决方案。使用连接!
1) 打开与您的文件的连接
con = file("file.csv", "r")
2)使用read.csv读取代码块
read.csv(con, nrows="CHUNK SIZE",...)
旁注:定义 colClasses 将大大加快速度。确保将不需要的列定义为 NULL。
3)做你需要做的事
4)重复。
5)关闭连接
close(con)
这种方法的优点是连接。如果省略此步骤,可能会减慢速度。通过手动打开连接,您实际上打开了数据集,并且在调用 close 函数之前不会将其关闭。这意味着当您循环访问数据集时,您将永远不会失去您的位置。假设您有一个包含 1e7 行的数据集。还假设您想要一次加载 1e5 行的块。由于我们打开连接,我们通过运行获取前 1e5 行read.csv(con, nrow=1e5,...)
,然后为了获得我们运行的第二个块read.csv(con, nrow=1e5,...)
还有,等等......
如果我们不使用连接,我们将以相同的方式获得第一个块,read.csv("file.csv", nrow=1e5,...)
,但是对于下一个块,我们需要read.csv("file.csv", skip = 1e5, nrow=2e5,...)
。显然这是低效的。尽管我们刚刚读取了 1e5 行,但我们必须重新找到 1e5+1 行。
最后,data.table::fread
是很棒的。但你不能通过它连接。所以这个方法行不通。
我希望这可以帮助别人。
UPDATE
人们不断对这篇文章进行投票,所以我想我应该再补充一个简短的想法。新的readr::read_csv
, like read.csv
,可以通过连接。然而,它是做广告的 http://blog.rstudio.org/2015/04/09/readr-0-1-0/大约快 10 倍。