阅读时,我发现读取大于内存的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 = ",")
Run Code Online (Sandbox Code Playgroud)
然后可以使用访问数据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 = ",")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4570 次 |
| 最近记录: |