使用sqldf将巨大的csv文件读入R中,但是sqlite文件需要两倍的空间,需要“吸尘”

时间:2012-09-12 15:03:14

标签: r sqlite sqldf

阅读时,我发现读取大于内存的csv文件的最佳方法是使用包read.csv.sql中的sqldf。该函数将数据直接读入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")清理数据库。这将回收空白空间,但需要很长时间,特别是当文件很大时。

有没有更好的解决方案,不会在第一次创建此数据重复?

1 个答案:

答案 0 :(得分:9)

解决方案:使用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 = ",")