繁体   English   中英

我该如何更改sqlite在Ubuntu Linux R上创建etilqs文件的临时文件夹?

[英]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 =选择创建文件的位置):

  1. 由PRAGMA temp_store_directory或sqlite3_temp_directory全局变量设置的目录
  2. SQLITE_TMPDIR环境变量
  3. TMPDIR环境变量
  4. / var / tmp
  5. / usr / tmp
  6. / tmp目录
  7. 当前工作目录(“。”)

我尝试了几种选择,但似乎都没有用:

  1. 设置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') 
  2. 在运行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。

  3. 我试着跑

     dbGetQuery(con, "PRAGMA temp_store = 2") 

    指示sqlite将临时文件保存在内存中。 但是,它仍将etilqs文件写入/ var / tmp。

  4. 我考虑过要为/ 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM