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

How can I change the temp folder where sqlite creates etilqs files on Ubuntu Linux R?

我运行在 Ubuntu 上 select 上的 select 某些 ID 中 table 具有千兆字节数据的 运行R 中的 sqldf 并且该过程正在创建临时 etilqs /var/tmp下的文件根据inotifywait监控文件变化。但是,我的 /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 会按以下顺序在目录中搜索临时文件存储位置(不是我可以通过 selecting tmpdir= 选择在何处创建文件的 tempfile()):

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

我尝试了几个选项,但 none 个选项似乎有效:

  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. 在 运行ning 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 创建一个符号 link 以指向 /mnt/tmp 但要做到这一点我想我必须删除文件夹 /mnt/tmp 首先。这并不理想,因为它是一个共享的 Linux 服务器并且 /mnt/tmp 的磁盘有时会被卸载。我不确定这是否会给其他应用程序和用户带来任何麻烦。

我不知道如何 check/change 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 and/or sqldf 包的源代码,看看它们是否使用自己的设置,或者从 R 中获取。如果是后者,我怀疑至少sqldf 那你就有办法了

但请记住在启动 R 之前设置 TMPDIR(或类似的)