[英]How can I change the temp folder where sqlite creates etilqs files on Ubuntu Linux R?
我在Ubuntu上的R中运行sqldf,以从具有千兆字节数据的大表中选择某些ID,并且该过程根据inotifywait监视文件更改在/ var / tmp下创建了临时etilqs文件。 但是,我的/ var / tmp位于小磁盘上,这有时会导致R出错。 我找到了一个有关如何在Windows上更改sqlite的临时文件夹位置的线程 ,但是我不知道如何使其在Linux下工作。
library(sqldf)
customer_extr <- sqldf("select b.*, a.year, a.name from product as b left join customer as a on a.ID = b.ID", dbname = "/home/userName/customer.db")
在我看来,sqlite按以下顺序搜索目录中的临时文件存储位置(不是tempfile(),我可以通过选择tmpdir =选择创建文件的位置):
我尝试了几种选择,但似乎都没有用:
设置temp_store_directory:
con <- dbConnect(dbDriver("SQLite"), dbname = "/home/userName/customer.db") dbGetQuery(con, "PRAGMA temp_store_directory = '/mnt/tmp'")
但这出错了:
Error in rsqlite_send_query(conn@ptr, statement) : basic_string::resize
当前,检查后未设置temp_store_directory
Sys.getenv('temp_store_directory')
在运行R之前,我将环境变量设置为所需的临时文件夹:/ mnt / tmp:
export SQLITE_TMPDIR=/mnt/tmp export TMPDIR=/mnt/tmp
我确认这已由设置成功
echo $SQLITE_TMPDIR echo $TMPDIR
在Linux下,
Sys.getenv('SQLITE_TMPDIR') Sys.getenv('TMPDIR')
在R中
但是,我的sqldf步骤仍然将etilqs文件写入/ var / tmp。
我试着跑
dbGetQuery(con, "PRAGMA temp_store = 2")
指示sqlite将临时文件保存在内存中。 但是,它仍将etilqs文件写入/ var / tmp。
我考虑过要为/ var / tmp创建一个符号链接以指向/ mnt / tmp,但是要做到这一点,我想我必须先删除/ mnt / tmp文件夹。 这是不理想的,因为它是共享的Linux服务器,并且/ mnt / tmp的磁盘有时会被卸载。 我不确定这是否会给其他应用程序和用户带来麻烦。
我不知道如何在R中检查/更改sqlite3_temp_directory全局变量。
这是我的会话信息:
> sessionInfo()
R version 3.3.2 (2016-10-31)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 14.04.5 LTS
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] sqldf_0.4-10 RSQLite_1.1 gsubfn_0.6-6 proto_1.0.0
loaded via a namespace (and not attached):
[1] DBI_0.5-1 memoise_1.0.0 Rcpp_0.12.8 digest_0.6.10 chron_2.3-47
我可以尝试将OS磁盘升级到更大的驱动器,但是没有办法告诉Linux下R中的sqlite在其他地方写入临时文件吗? 任何建议将不胜感激!
您可以让R使用不同的临时目录,它尊重环境变量的几种设置:
edd@max:~$ Rscript -e 'print(tempdir())' # default
[1] "/tmp/RtmpUdPCFL"
edd@max:~$ TMPDIR="." Rscript -e 'print(tempdir())' # overridden
[1] "./RtmpsJk2lP"
edd@max:~$
我们将不得不查看RSQLite和/或sqldf程序包的源,以查看它们是否使用自己的设置,还是从R中获取。如果是后者,我怀疑至少是sqldf,那么您有办法。
但是一定要记得在开始R 之前设置TMPDIR(或类似设置)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.