使用sqldf将巨大的csv文件读入R是可行的,但sqlite文件占用的空间是它应该占用的空间的两倍;抽真空;

使用sqldf将巨大的csv文件读入R是可行的,但sqlite文件占用的空间是它应该占用的空间的两倍;抽真空;,r,sqlite,sqldf,R,Sqlite,Sqldf,仔细阅读后,我发现读取大于内存的csv文件的最佳方法是使用包sqldf中的read.csv.sql。此函数将数据直接读入sqlite数据库,然后执行sql语句 我注意到以下几点:读取到sqlite中的数据似乎存储在一个临时表中,因此为了使其可供将来使用,需要在sql语句中对其进行询问 例如,以下代码将一些示例数据读取到sqlite中: # generate sample data sample_data <- data.frame(col1 = sample(letters, 100000

仔细阅读后,我发现读取大于内存的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 = ",")
#生成样本数据

样本数据解决方案:使用
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 = ",")
库(RSQLite)

con您可能希望按照响应者的建议直接使用RSQLite,但我已经更新了sqldf主页上的示例9和10,以展示如何使用sqldf持久连接来实现这一点,而不会重复。具体参见示例10c。还要注意,sqldf接受sql语句的向量,并且在向量中的最后一条语句执行之前不会破坏数据库。