我在Ubuntu上的R中运行sqldf,从大表中选择具有千兆字节数据的某些ID,并且该进程根据inotifywait监视文件更改在/ var / tmp下创建临时etilqs文件。但是,我的/ var / tmp在一个小磁盘上,这偶尔会导致R出错。我在Windows上找到了如何更改sqlite临时文件夹位置的thread,但我无法弄清楚如何在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_directorySys.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
我可以尝试将我的操作系统磁盘升级到更大的驱动器,但是有没有办法告诉Linux下的Rql中的sqlite在其他地方写临时文件?任何建议都将受到高度赞赏!
答案 0 :(得分:0)
您可以让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(或类似的)。