使用 sqldf 将巨大的 csv 文件读取到 R 中是可行的,但是 sqlite 文件占用的空间是它应该和需要的两倍 "vacuuming"

标签 r sqlite sqldf

四处阅读,我发现读取大于内存的 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/

相关文章:

r - ggplot2 与scale_brewer 的顺序相反

json - 在 R 中将大型数据框写为 json 的最快方法是什么?

Python & Sqlite3 - 子集一个表然后加入另外两个表

sql - 在 sqldf/R 中的情况

r - 如果一个选择具有给定值,则选择整个组

SQLite 删除 group by 中的联系

r - 如果每个数据集中的列具有不同的名称,如何将两个数据框合并到一列上?

regex - 使用 R 读取文本字段中包含未引号换行符的文件

java - 无法使用 JDBC 在 SQLite3 数据库中插入值

java - 无法打开数据库/无法将(数据库)的区域设置更改为 'en_US'