2013-05-20 4 views
0

Я запускаю скрипт, который загружает несколько файлов. По достижении 50 загруженных файлов я получаю сообщение об ошибке «все соединения используются».Закрытие соединений read.table в R

Я понял, что мне нужно закрыть соединения, но я столкнулся со следующей проблемой.

con = file(paste('/home/rstudio/userstats/',cuserid,'.tsv',sep="")) 
userstats_current = read.table(con, sep="\t", header=0, quote="", stringsAsFactors=F) 
close(con) 
Error in close.connection(con) : invalid connection 

Если я печатаю следующее, однако все работает отлично:

con = file(paste('/home/rstudio/userstats/',cuserid,'.tsv',sep="")) 
close(con) 

ли произойдет что-то соединения, когда применяется read.table и как я могу управлять, чтобы закрыть эти соединения?

ОБНОВЛЕНИЕ

Благодарим за ответы. Проблема в том, что когда я запускаю цикл foreach даже с одним ядром через некоторое время, я продолжаю получать эту ошибку всех подключений.

registerDoMC(2) 
matrix <- foreach(i=1:nrow(sample), .combine=rbind) %dopar% {....} 
+3

Может быть, когда он читает в EOF (конец файла) автоматически закрывается? В документации для open говорится: «В общих функциях, использующих соединения, они будут открываться, если они не открыты, но затем снова закройте их, чтобы явное закрытие открытого вызова соединения». – Frank

+0

Вместо того, чтобы явно создавать соединение, почему бы просто не передать имя файла 'read.table'? В общем, R достаточно умен, чтобы закрыть соединения, которые он открывает. –

+0

Это работает для меня с 1000 файлами, поэтому я подозреваю, что проблема кроется в другом месте (например, в RStudio?). 'x <- list(); для (i в 1: 1000) {fn <- paste0 ("z", i); написать (rnorm (5), fn); f <- файл (fn); x [[i]] <- read.table (f)} ' –

ответ

2

Ошибка была вызвана запуском read.table, когда файл не существует. После нескольких запросов read.table для файлов, которые не существуют на дисковых соединениях, не освобождаются (в отличие от файлов).

Чтобы преодолеть проблему, я использовал if (file.exists (filename)) {read.table (filename)} и, похоже, исправил проблему. Спасибо всем, что помогли мне решить эту проблему.

0

Вы можете столкнуться с подобного рода ошибок при выполнении HTTP вызовов с помощью команды

read.table(url("http://...."),....) 

URL() Это может произойти при попытке подключения, но получить ошибку 500 сервера. В этом случае read.table может неправильно закрыть соединение. После многих циклов такого типа вы будете накапливать сокеты http CLOSE_WAIT, которые вы можете просмотреть с помощью «netstat -a», что приведет к ошибке «все подключения в использовании».

Решение этой проблемы является использование пакета RCurl для выполнения ваших соединений URL, который описан в этом вопросе переполнением стека:

Stack Overflow: read data from internet

Смежные вопросы