[R-sig-Geo] raster/rgdal- problem: Too many open files (Linux)

Jon Olav Skoien jon.skoien at jrc.ec.europa.eu
Wed Aug 7 10:18:40 CEST 2013







On 06-Aug-13 21:35, Roger Bivand wrote:
> On Tue, 6 Aug 2013, Mauricio Zambrano-Bigiarini wrote:
>
>> On 08/05/2013 04:37 PM, Jon Olav Skoien wrote:
>>> Dear list,
>>>
>>> We have a problem which appears to be a bug in either rgdal or raster,
>>> although it could also be a bug in base R or in our understanding of 
>>> how
>>> to deal with connections.
>>>
>>> We have a process which is writing a rather large (~10-20.000) 
>>> number of
>>> geoTiffs via writeRaster. However, the process has frequently stopped
>>> with an error of the type:
>>> Error in .local(.Object, ...) :
>>>     TIFFOpen:/local0/skoiejo/hri/test.tif: Too many open files
>>> The issue seems to be the creation of temp-files in the temp directory
>>> which is given by tempdir(), not by raster:::.tmpdir(). These 
>>> temp-files
>>> seem to be created by the call
>>>     transient <- new("GDALTransientDataset", driver=driver, 
>>> rows=r at nrows,
>>> cols=r at ncols, bands=nbands, type=dataformat, fname=filename,
>>> options=options, handle=NULL)
>>> from raster:::.getGDALtransient
>>> The temp-files are deleted after writing the geoTiff, but are not
>>> removed from the list of open files in Linux, which on our system was
>>> limited to 1024 files (ulimit -n) per process. Below is a script which
>>> can replicate the issue (takes a few minutes to reach 1024) and
>>> sessionInfo().
>>>
>>> Currently we are trying to solve the issue by increasing the limit of
>>> file connections, but we would prefer a solution where the connections
>>> are properly deleted, either before writeRaster finishes, or a command
>>> which we can include in our script, either R-code or a call to 
>>> System().
>>> The connections are not visible via showConnections(), and
>>> closeAllConnections() does not help.
>>>
>>> Thanks,
>>> Jon
>>
>> I stumbled across the same problem (with exactly the same 
>> configuration reported by Jon with 'sessionInfo()'), while trying to 
>> change the values of some pixels in more than 6000 maps.
>>
>> Thank  you very much Jon for the detailed report about the problem, 
>> which helped me to find a workaround to this problem (so far, just to 
>> split the 6000 maps in smaller groups).
>>
>>>
>>>
>>> r <- raster(system.file("external/test.grd", package="raster"))
>>> for (ifile in 1:2000) {
>>>     writeRaster(r, "test.tif", format = "GTiff", overwrite = TRUE)
>>>     print(ifile)
>>> }
>>>
>>
>> After trying the previous reproducible code, I don't understand why I 
>> got the error when ifile=1019 and not 1024:
>>
>> ....
>> [1] 1018
>> [1] 1019
>> Error in .local(.Object, ...) :
>>  TIFFOpen:/home/hzambran/test.tif: Too many open files
>>
>
> There are other files opened by the R process that reduce the number 
> needed. The problem is in the GDAL bindings with R, I haven't tried to 
> see whether other applications keeping GDAL loaded face the same 
> issues. GDAL applications typically write once and exit, so this isn't 
> a problem there.
>
> The current GDAL.close() code says unlink() to a vector of files with 
> the same basename, but actually unlink() now appears to fail, leaving 
> the files in place. Using file.remove() leads to the same result, and 
> using deleteFile() provokes other problems.
>
> This will probably turn out to be something trivial, but will take a 
> great deal of time to debug, as the consequences of changing the 
> dataset structure are possibly extensive.
>
> For the time being, the work-around is the only route; if volunteers 
> can debug this, progress may be possible, but everything else has to 
> continue to work.
>
> Roger

Roger, thanks for having a look at this.
I just checked with an older version, and it seems the problem was 
introduced more or less at the same time as a valgrind issue was fixed 
in revision 456. Running the example above worked with R 2.14.0 and 
rgdal 0.8-5 (sessionInfo below), but failed when upgrading rgdal (and 
sp). The problem seems to be in the C++ code (I already tried to revert 
the R code of GDAL.close to 0.8-5, without any difference), which I am 
unfortunately not able to debug.

As there is no quick fix at the moment, I just thought it would be good 
to summarize the possible workarounds for other people who encounter 
this problem:
- Split up the process in smaller problems
- Increase the number of possible file connections (the standard on 
Linux seems to be 1024, but I have not seen any reason for not 
increasing this to e.g. 40.000, as currently on our system)
- Do parallel processing (will work better as each sub-process will have 
its own list of file connections).

Best wishes,
Jon


R version 2.14.0 (2011-10-31)
Platform: x86_64-unknown-linux-gnu (64-bit)

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=C                 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] rgdal_0.8-5   raster_2.0-41 sp_1.0-5

loaded via a namespace (and not attached):
[1] grid_2.14.0    lattice_0.20-0




>
>>
>>
>> Thanks again Jon for sharing your findings about this.
>>
>> All the best,
>>
>> Mauricio Zambrano-Bigiarini, Ph.D
>>
>>
>>
>


-- 
Jon Olav Skøien
Joint Research Centre - European Commission
Institute for Environment and Sustainability (IES)
Land Resource Management Unit

Via Fermi 2749, TP 440,  I-21027 Ispra (VA), ITALY

jon.skoien at jrc.ec.europa.eu
Tel:  +39 0332 789206

Disclaimer: Views expressed in this email are those of the individual and do not necessarily represent official views of the European Commission.



More information about the R-sig-Geo mailing list