2017-01-18 58 views
0

我在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文件=):

  1. 通過PRAGMA temp_store_directory或由sqlite3_temp_directory全局變量設置的目錄
  2. 的SQLITE_TMPDIR環境變量
  3. TMPDIR環境變量
  4. /var/tmp中
  5. 在/ usr/tmp目錄
  6. /tmp目錄
  7. 當前工作目錄( 「」)

我嘗試了一些選擇,但他們都不似乎工作:

  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([email protected], 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的磁盤有時會被卸載。我不確定這是否會給其他應用程序和用戶帶來麻煩。

我不知道如何檢查/改變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在其他地方寫入臨時文件?任何建議將不勝感激!

+0

'basic_string的:: resize'是不是一個錯誤消息。 'temp_store_directory'不是一個環境變量;你可以通過執行查詢'PRAGMA temp_store_directory'來讀取它。無論如何,你想使用的實際目錄是什麼?你能從R訪問它嗎? –

+0

我運行了'PRAGMA temp_store_directory',它返回空白。但我無法將其設置爲不同的值(路徑)。我想要使​​用的實際目錄位於第二個硬盤驅動器/ mnt/tmp上。是R可以訪問它。 ''basic_string :: resize'發生並停止了R,當OS磁盤空間耗盡時,由sqldf在/ var/tmp中創建了大量臨時文件。 – smz

回答

0

你可以得到R來使用不同的臨時目錄,它尊重環境變量的幾個設置:

[email protected]:~$ Rscript -e 'print(tempdir())'    # default 
[1] "/tmp/RtmpUdPCFL" 
[email protected]:~$ TMPDIR="." Rscript -e 'print(tempdir())' # overridden 
[1] "./RtmpsJk2lP" 
[email protected]:~$ 

我們將與RSQLite的來源和/或sqldf包看看,看看他們是否使用他們自己的設置,或從R拿走它。如果是後者,正如我懷疑至少sqldf那麼你有辦法。

但是千萬要記得設置TMPDIR(或類似)開始R.

+0

這工作!謝謝!我不知道我需要將變量放在R的同一行。當我先導出TMPDIR = .'時,它不適用於我,然後運行'R'。由於某些未知的原因,'sqldf'仍然使用'/ var/tmp'來保存臨時文件。 – smz

+0

這是一個shell公約。你也可以通過R在啓動時讀取的文件設置環境變量,參見'help(啓動)'。 –

相關問題