2013-05-20 39 views
0

我正在運行加載多個文件的腳本。在達到50個加載的文件時,我收到一個錯誤「所有連接正在使用中」。在R中關閉read.table連接

我想我必須關閉連接,但我遇到以下問題。

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做一些事情發生的連接,我怎麼能設法關閉這些連接?

UPDATE

謝謝您的迴應。問題是,當我運行一個foreach循環,即使有一個核心後一段時間我不斷得到這個所有連接錯誤。

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

也許一旦讀取到EOF(文件結束)它會自動關閉?開放的文檔說「在一般情況下,使用連接的函數將打開它們,如果它們沒有打開,但是再次關閉它們,所以要明確地打開一個打開的連接。」 – Frank

+0

而不是顯式創建連接,爲什麼不把文件名傳遞給'read.table'?一般來說,R足夠聰明,可以關閉它自己打開的連接。 –

+0

這適用於1000個文件,所以我懷疑問題在別處(例如,也許在RStudio中?)。 'x < - list(); for(i in 1:1000){fn < - paste0(「z」,i);寫(rnorm(5),fn); f < - file(fn); x [[i]] < - read.table(f)}' –

回答

2

錯誤是由於文件不存在時運行read.table導致的。在多個read.table文件的光盤連接上不存在的請求不會被釋放(不像文件確實存在)。

爲了解決我使用if(file.exists(filename)){read.table(filename)}的問題,並且這似乎解決了問題。謝謝大家幫助我解決這個問題。

0

您可以通過URL()命令

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

當您嘗試連接,但得到500服務器錯誤就會發生這種情況使得HTTP調用的時候碰上了類似類型的錯誤。在這種情況下,read.table可能無法正確關閉連接。經過這種循環之後,您將累積http CLOSE_WAIT套接字,您可以使用'netstat -a'查看這些套接字,從而導致「所有連接正在使用」錯誤。

對此的解決方案是利用RCurl包進行您的網址連接,這是在這個堆棧溢出問題描述:

堆棧溢出: read data from internet