6

环顾四周,我发现读取大于内存的 csv 文件的最佳方法是使用read.csv.sqlfrom package 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"). 这会回收空的空间,但是需要很长时间,尤其是文件很大的时候。

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

4

1 回答 1

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 = ",")
于 2012-09-12T16:00:44.293 回答