2017-01-18 12 views
0

Я запускаю sqldf в R на Ubuntu для выбора определенных идентификаторов из большой таблицы с гигабайтами данных, и процесс создает временные файлы etilqs в/var/tmp в соответствии с изменениями файла мониторинга inotifywait. Однако my/var/tmp находится на маленьком диске, и это иногда приводит к ошибке R. Я нашел thread о том, как изменить местоположение папки temp для sqlite в Windows, но я не мог понять, как заставить его работать под Linux.Как изменить временную папку, где sqlite создает файлы etilqs на Ubuntu Linux R?

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 поиски каталоги местах временного хранения файлов (не TEMPFILE(), что я могу выбрать, где создать файл, выбрав TMPDIR =) в следующем порядке:

  1. каталог устанавливается ПРАГМА temp_store_directory или по sqlite3_temp_directory глобальной переменной
  2. среда SQLITE_TMPDIR переменная переменная
  3. среда TMPDIR
  4. /вар/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, я установил переменные окружения в нужную папку Temp:/мнт/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 файлы в/вар/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 

Я могу попытаться модернизировать мой OS диск к более мощный диск, но не существует способа сказать sqlite в R под Linux для записи временных файлов в другом месте? Любые предложения будут высоко оценены!

+0

'basic_string :: resize' не сообщение об ошибке. 'temp_store_directory' не является переменной среды; вы бы прочитали его, выполнив запрос 'PRAGMA temp_store_directory'. В любом случае, каков фактический каталог, который вы хотите использовать? Можете ли вы получить к нему доступ из R? –

+0

Я побежал 'PRAGMA temp_store_directory', и он возвращает пустое. Но я не могу установить его на другое значение (путь). Фактический каталог, который я хочу использовать, находится на втором жестком диске/mnt/tmp. Да R может получить к нему доступ. 'basic_string :: resize' произошел и остановился R, когда на диске появилось много файлов temp, созданных в/var/tmp по sqldf. – 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

Это конвенция оболочки. Вы также можете установить переменные среды через файлы R, которые читаются при запуске, см. 'Help (Startup)'. –