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

时间:2017-01-18 23:30:42

标签: r linux sqlite ubuntu sqldf

我在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 =)来选择创建文件的位置:

  1. PRAGMA temp_store_directory或sqlite3_temp_directory全局变量设置的目录
  2. SQLITE_TMPDIR环境变量
  3. TMPDIR环境变量
  4. / var / tmp中
  5. 的/ usr / TMP
  6. 的/ tmp
  7. 当前工作目录(&#34;。&#34;)
  8. 我尝试了一些选项,但似乎没有一个可行:

    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的磁盘有时会被卸载。我不确定这是否会给其他应用程序和用户带来麻烦。

    5. 我不知道如何检查/更改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在其他地方写临时文件?任何建议都将受到高度赞赏!

1 个答案:

答案 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(或类似的)