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

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

概述阅读,我发现读取大于内存的csv文件的最佳方法是使用包sqldf中的read.csv.sql.该函数将数据直接读入sqlite数据库,从而执行sql语句. 我注意到以下内容:似乎读入sqlite的数据存储在一个临时表中,因此为了使其可供以后使用,需要在sql语句中这样询问. 作为示例,以下代码将一些示例数据读入sqlite: # generate sample datasample_data < 阅读,我发现读取大于内存的csv文件的最佳方法是使用包sqldf中的read.csv.sql.该函数将数据直接读入sqlite数据库,从而执行SQL语句.

我注意到以下内容:似乎读入sqlite的数据存储在一个临时表中,因此为了使其可供以后使用,需要在SQL语句中这样询问.

作为示例,以下代码将一些示例数据读入sqlite:

# generate sample datasample_data <- data.frame(col1 = sample(letters,100000,TRUE),col2 = rnorm(100000))# save as csvwrite.csv(sample_data,"sample_data.csv",row.names = FALSE)# create a sample sqlite databaselibrary(sqldf)sqldf("attach sample_db as new") # read the csv into the database and create a table with its contentread.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 databasedbWritetable(con,name="sample_data",value="sample_data.csv",row.names=FALSE,header=TRUE,")
总结

以上是内存溢出为你收集整理的使用sqldf将巨大的csv文件读入R中,但是sqlite文件需要两倍的空间,需要“吸尘”全部内容,希望文章能够帮你解决使用sqldf将巨大的csv文件读入R中,但是sqlite文件需要两倍的空间,需要“吸尘”所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1178663.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存