Я запускаю 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 =) в следующем порядке:
- каталог устанавливается ПРАГМА temp_store_directory или по sqlite3_temp_directory глобальной переменной
- среда SQLITE_TMPDIR переменная переменная
- среда TMPDIR
- /вар/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, я установил переменные окружения в нужную папку 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.
Я попытался запустить
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
Я могу попытаться модернизировать мой OS диск к более мощный диск, но не существует способа сказать sqlite в R под Linux для записи временных файлов в другом месте? Любые предложения будут высоко оценены!
'basic_string :: resize' не сообщение об ошибке. 'temp_store_directory' не является переменной среды; вы бы прочитали его, выполнив запрос 'PRAGMA temp_store_directory'. В любом случае, каков фактический каталог, который вы хотите использовать? Можете ли вы получить к нему доступ из R? –
Я побежал 'PRAGMA temp_store_directory', и он возвращает пустое. Но я не могу установить его на другое значение (путь). Фактический каталог, который я хочу использовать, находится на втором жестком диске/mnt/tmp. Да R может получить к нему доступ. 'basic_string :: resize' произошел и остановился R, когда на диске появилось много файлов temp, созданных в/var/tmp по sqldf. – smz