我在Ubuntu上運行R中的sqldf來從一個大數據表中選擇某些ID,並且該進程根據inotifywait監視文件更改在/ var/tmp下創建臨時etilqs文件。但是,我的/ var/tmp在一個小磁盤上,偶爾會導致R出錯。我發現一個thread關於如何更改Windows上的sqlite的臨時文件夾位置,但我無法弄清楚如何使它在Linux下工作。如何更改sqlite在Ubuntu Linux R上創建etilqs文件的臨時文件夾?
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的搜索目錄(不是臨時文件(),我可以選擇創建選擇TMPDIR文件=):
- 通過PRAGMA temp_store_directory或由sqlite3_temp_directory全局變量設置的目錄
- 的SQLITE_TMPDIR環境變量
- TMPDIR環境變量
- /var/tmp中
- 在/ usr/tmp目錄
- /tmp目錄
- 當前工作目錄( 「」)
我嘗試了一些選擇,但他們都不似乎工作:
集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([email protected], statement) : basic_string::resize
目前,temp_store_directory不檢查
Sys.getenv('temp_store_directory')
運行R之前,設置後,我設置環境變量所需的臨時文件夾:到/ mnt/tmp目錄:
export SQLITE_TMPDIR=/mnt/tmp export TMPDIR=/mnt/tmp
我驗證了這一點已成功設立
echo $SQLITE_TMPDIR echo $TMPDIR
在Linux下,
在R.Sys.getenv('SQLITE_TMPDIR') Sys.getenv('TMPDIR')
但是,我sqldf一步還是寫etilqs文件到/ var/tmp中。
我試圖運行
dbGetQuery(con, "PRAGMA temp_store = 2")
指示sqlite的保存在內存中的臨時文件。但是,它仍然將etilqs文件寫入/ var/tmp。
我想過爲/ var/tmp創建一個指向/ mnt/tmp的符號鏈接,但要這麼做,我認爲我必須首先刪除文件夾/ mnt/tmp。這是不理想的,因爲它是共享的Linux服務器,並且/ mnt/tmp的磁盤有時會被卸載。我不確定這是否會給其他應用程序和用戶帶來麻煩。
我不知道如何檢查/改變sqlite3_temp_directory全局變量R.
這是我的會議信息:
> 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在其他地方寫入臨時文件?任何建議將不勝感激!
'basic_string的:: resize'是不是一個錯誤消息。 'temp_store_directory'不是一個環境變量;你可以通過執行查詢'PRAGMA temp_store_directory'來讀取它。無論如何,你想使用的實際目錄是什麼?你能從R訪問它嗎? –
我運行了'PRAGMA temp_store_directory',它返回空白。但我無法將其設置爲不同的值(路徑)。我想要使用的實際目錄位於第二個硬盤驅動器/ mnt/tmp上。是R可以訪問它。 ''basic_string :: resize'發生並停止了R,當OS磁盤空間耗盡時,由sqldf在/ var/tmp中創建了大量臨時文件。 – smz