四处阅读,我发现读取大于内存的 csv 文件的最佳方法是使用 sqldf
包中的 read.csv.sql
。该函数将数据直接读入sqlite数据库,并执行sql语句。
我注意到了以下几点:读入sqlite的数据似乎是存储在一个临时表中的,所以为了方便以后使用,需要在sql语句中这样询问。
例如,下面的代码将一些样本数据读入sqlite:
# generate sample data
sample_data <- data.frame(col1 = sample(letters, 100000, TRUE), col2 = rnorm(100000))
# save as csv
write.csv(sample_data, "sample_data.csv", row.names = FALSE)
# create a sample sqlite database
library(sqldf)
sqldf("attach sample_db as new")
# read the csv into the database and create a table with its content
read.csv.sql("sample_data.csv", sql = "create table data as select * from file",
dbname = "sample_db", header = T, row.names = F, sep = ",")
然后可以使用 sqldf("select * from data limit 5", dbname = "sample_db")
访问数据。
问题如下:sqlite 文件占用的空间是它应该占用的空间的两倍。我的猜测是它包含两次数据:一次用于临时读取,一次用于存储表。可以使用 sqldf("vacuum", dbname = "sample_db")
清理数据库。这将回收空白空间,但需要很长时间,尤其是当文件很大时。
是否有更好的解决方案,不会在第一次创建此数据重复?
最佳答案
解决方案:使用RSQLite
而不通过sqldf
:
library(RSQLite)
con <- dbConnect("SQLite", dbname = "sample_db")
# read csv file into sql database
dbWriteTable(con, name="sample_data", value="sample_data.csv",
row.names=FALSE, header=TRUE, sep = ",")
关于使用 sqldf 将巨大的 csv 文件读取到 R 中是可行的,但是 sqlite 文件占用的空间是它应该和需要的两倍 "vacuuming",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12391162/