[Rd] [R] Problem With Repeated Use Of Load/Save/Close Commands (PR#13841)
murdoch at stats.uwo.ca
murdoch at stats.uwo.ca
Sat Jul 18 14:15:12 CEST 2009
On 17/07/2009 7:57 PM, Marilyn & Rich Short wrote:
> Hello,
>
> I'm having a problem in R with repeated use of the "load", "save", and
> "close" commands. I'm getting an error message that reads, "Too many
> open files". I'm opening files and closing them (and unlinking them),
> but when I go through that process 509 times, the program halts and I
> get this error message: "cannot open the connection" with warning
> messages: "Too many open files". I've been working on this problem for
> a couple of weeks and have gleaned a bit of info from different internet
> threads, but no solutions yet.
>
> I'm using Windows XP, SP3 and R 2.9.1.
> Here is my session info:
>
> R version 2.9.1 (2009-06-26)
> i286-pc-mingw32
>
> locale:
> LC_COLLATE=English_United States.1252;LC_CTYPE=English_United
> States. 1252;LC_MONETARY=English_United
> States. 1252;LC_NUMERIC=C;LC_TIME=English_United States.1252
>
> attached base packages:
> [1] stats graphics grDevices utils datasets methods base
>
> I'm using the vanilla load of R, with nothing added after booting up.
> The problem also occurs on my Vista machine as well.
>
> The program below will induce the problem.
> ------------------------------------------------------------
> junk = 1
> PathA = tempdir()
> conX = paste(PathA,"junk",sep="\\")
> outJunk = file(conX, open="wb")
> save(junk, file=outJunk)
> close(outJunk)
> for(i in 1:4000){
> outMIA = file(conX, open="rb")
> load(file=outMIA)
> close(outMIA)
> closeAllConnections()
> unlink(conX)
> rm(outMIA)
> rm(junk)
> cat(" i = ",i,sep=" ")
> gc()
> zzz = showConnections(all=FALSE)
> cat(" zzz = ",zzz,"\n",sep=" ")
> }
> --------------------------------------------------------------------
> There is some talk on the internet that some windows systems have a
> limit of 512 files that can be open at one time. Even though I'm closing
> my files each time, something is keeping track of how many times I've
> opened and closed a file in a session. I've talked to Microsoft and run
> a test program in Visual Studio C#, and, at the moment, it looks like
> the problem does not lie in the Microsoft arena. The C# program
> performed a similar task 10,000 times without a problem. I'm not totally
> convinced, but the current evidence says to look elsewhere.
>
> I've attached a script that will induce the problem. However, be warned
> that, if you use it, you will have to get out of R after you run it. R
> will no longer be able to access files such as help or sessionInfo().
> This can be solved by getting out of the R GUI and back in.
>
> R E-mails from as far back as 2006 ask for help on the issue. There have
> been several suggestions, but no confirmed solution that I can find. You
> will see my attempt at these suggestions in the script [ rm(outMIA);
> rm(junk); closeAllConnections(); and gc(); after close(outMIA); and
> unlink(conX);]. For me, this becomes important because it limits the
> total number if iterations in nested do-loops. This is where I ran into
> the problem. The program above will allow you to reproduce the problem.
>
> Any suggestion would be greatly appreciated.
This looks like a bug to me, and so I've posted it to the bugs list, but
your script doesn't make sense for normal use. Before the loop you
create a file named according to conX containing the junk variable, and
then within the loop you load that file, *then delete it*, using
unlink(). However, if you examine the value of unlink(), you'll see
that it fails every time.
Moreover, the use of connections is unnecessary: load() can work with a
filename. So you can skip the file() and close() calls.
If I simplify your script by removing the unnecessary stuff, then it
works. That is, this works:
junk = 1
PathA = tempdir()
conX = paste(PathA,"junk",sep="\\")
save(junk, file=conX)
for(i in 1:4000){
load(file=conX)
rm(junk)
cat(" i = ",i,sep=" ")
gc()
zzz = showConnections(all=FALSE)
cat(" zzz = ",zzz,"\n",sep=" ")
}
So a suggestion for a workaround is simply to follow the pattern above,
rather than that of your demonstration code.
I'll spend a bit more time and see if I can find what is causing the
open file leak.
Duncan Murdoch
More information about the R-devel
mailing list