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

如何更改sqlite在Ubuntu Linux R上创建etilqs文件的临时文件夹?,r,linux,sqlite,ubuntu,sqldf,R,Linux,Sqlite,Ubuntu,Sqldf,我在Ubuntu上的R中运行sqldf,从一个包含千兆字节数据的大表中选择某些ID,这个过程根据inotifywait监控文件更改在/var/tmp下创建临时etilqs文件。然而,my/var/tmp位于一个小磁盘上,这偶尔会导致R出错。我找到了一个关于如何在Windows上更改sqlite的临时文件夹位置的方法,但我不知道如何使它在Linux下工作 library(sqldf) customer_extr <- sqldf("select b.*, a.year, a.name fro

我在Ubuntu上的R中运行sqldf,从一个包含千兆字节数据的大表中选择某些ID,这个过程根据inotifywait监控文件更改在/var/tmp下创建临时etilqs文件。然而,my/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")
当前,检查后未设置临时存储目录

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
    

    我可以尝试将我的操作系统磁盘升级到一个更大的驱动器,但是没有办法告诉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(或类似设置)。

    basic\u string::resize
    不是错误消息<代码>临时存储目录不是环境变量;您可以通过执行查询
    PRAGMA temp\u store\u目录
    来读取它。不管怎样,您想要使用的实际目录是什么?你能从R访问它吗?我运行了PRAGMA temp\u store\u目录,它返回空白。但我无法将其设置为其他值(路径)。我要使用的实际目录位于第二个硬盘驱动器/mnt/tmp上。是的,我可以访问它<当操作系统磁盘空间耗尽,sqldf在/var/tmp中创建了大量临时文件时,发生并停止了代码>基本字符串::resize。这很有效!谢谢我不知道我需要将变量放在R的同一行。当我
    先导出TMPDIR=。
    然后运行
    R
    时,它对我不起作用。出于未知原因,
    sqldf
    仍然使用
    /var/tmp
    保存临时文件。这是一种shell约定。您还可以通过启动时读取的文件设置环境变量,请参阅
    帮助(启动)
    > 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
    
    edd@max:~$ Rscript -e 'print(tempdir())'              # default
    [1] "/tmp/RtmpUdPCFL"
    edd@max:~$ TMPDIR="." Rscript -e 'print(tempdir())'   # overridden
    [1] "./RtmpsJk2lP"
    edd@max:~$