如何更改 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()):
- 由 PRAGMA temp_store_directory 或 sqlite3_temp_directory 全局变量
设置的目录
- SQLITE_TMPDIR环境变量
- TMPDIR 环境变量
- /var/tmp
- /usr/tmp
- /tmp
- 当前工作目录 (".")
我尝试了几个选项,但 none 个选项似乎有效:
设置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')
在 运行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。
我试过了运行
dbGetQuery(con, "PRAGMA temp_store = 2")
指示sqlite在内存中保存临时文件。但是,它仍在将 etilqs 文件写入 /var/tmp.
我想为 /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(或类似的)。
我运行在 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()):
- 由 PRAGMA temp_store_directory 或 sqlite3_temp_directory 全局变量 设置的目录
- SQLITE_TMPDIR环境变量
- TMPDIR 环境变量
- /var/tmp
- /usr/tmp
- /tmp
- 当前工作目录 (".")
我尝试了几个选项,但 none 个选项似乎有效:
设置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')
在 运行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。
我试过了运行
dbGetQuery(con, "PRAGMA temp_store = 2")
指示sqlite在内存中保存临时文件。但是,它仍在将 etilqs 文件写入 /var/tmp.
我想为 /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(或类似的)。