1

複数のファイルをロードするスクリプトを実行しています。ロードされたファイルが 50 個に達すると、「すべての接続が使用中です」というエラーが表示されます。

接続を閉じる必要があると考えましたが、次の問題が発生しました。

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 が適用されたときに接続に何かが起こりますか?これらの接続を閉じるにはどうすればよいですか?

アップデート

ご回答ありがとうございます。問題は、しばらくして 1 つのコアでも foreach ループを実行すると、このすべての接続エラーが発生し続けることです。

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

2 に答える 2

2

このエラーは、ファイルが存在しないときに read.table を実行したことが原因でした。ディスク接続に存在しないファイルに対する複数の read.table 要求では、(ファイルが存在する場合とは異なり) 解放されません。

if (file.exists(filename)){read.table(filename)} を使用した問題を克服するために、問題が修正されたようです。これを解決するのを手伝ってくれてありがとう。

于 2013-05-21T11:53:40.107 に答える
0

url() コマンドを介して http 呼び出しを行うときに、同様の種類のエラーが発生する可能性があります。

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

これは、接続しようとして 500 サーバー エラーが発生した場合に発生する可能性があります。この場合、read.table は接続を適切に閉じない可能性があります。この種のループを何度も繰り返した後、「netstat -a」で表示できる http CLOSE_WAIT ソケットが蓄積され、「すべての接続が使用中です」というエラーが発生します。

これに対する解決策は、RCurl パッケージを使用して URL 接続を実行することです。これについては、このスタック オーバーフローの問題で説明されています。

スタック オーバーフロー: インターネットからデータを読み取る

于 2014-01-16T23:53:26.237 に答える