在查看了这个线程后,我注意到没有提到这个问题的显着解决方案。使用连接!
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+1 行,尽管我们只是在 1e5 行中读取。
最后,data.table::fread
很棒。但是你不能通过它连接。所以这种方法行不通。
我希望这可以帮助别人。
更新
人们一直在支持这篇文章,所以我想我会再补充一个简短的想法。new readr::read_csv
, like read.csv
,可以传递连接。然而,它被宣传为大约快 10 倍。