[gdal-dev] Can't use two datasets read-only from same files?
Nik Sands
nixanz at nixanz.com
Sun Feb 23 02:03:38 PST 2014
Hi Even,
Thanks for your replies. I think the number of files may be the problem. Note that this is on the iPhone simulator (so effectively Mac OS X).
Yes, the "path" is a directory that contains shapefiles representing 352 layers. Each layer has a .shp, .shx, .dbf, .prj, so 1409 files in total. I'm not sure how many of these OGR needs to have open simultaneously.
Anyhow, I appreciate your reply. I think I've hit the OS file limit. I didn't even realise how many files were in that directory until you mentioned this possibility.
Cheers,
Nik.
On 23 Feb 2014, at 6:51 pm, Even Rouault <even.rouault at mines-paris.org> wrote:
> Le dimanche 23 février 2014 08:40:11, Even Rouault a écrit :
>> Nik,
>>
>> what you try to do is perfectly valid and should work. I've just tried it
>> myself, but I can't reproduce any error. If you are working on Linux, could
>> you run your program with valgrind and look if it reports some errors ?
>> The only explanation I can imagine for now is that the file system on which
>> your shapefile is located doesn't support a file to be opened more than
>> once at a time, but this would be extremely surprising !
>
> oh wait, is the "path" in your example a directory that contains lots of
> shapefiles ? In that case, you might reach the maximum number of opened files by
> a process. But... since GDAL 1.9, there is a mechanism in the shapefile driver
> to limit the number of layers opened simultaneously to 100 per datasource (so
> 200 files for .shp and .dbf). With 2 datasources, this would be 400 files which
> is still below the 1024 limit on Linux.
>
>>
>> Best regards,
>>
>> Even
>>
>>> Hi GDAL devs,
>>>
>>> I have a need to open the same set of Shapefiles as two independent
>>> datasets, BOTH of which are READ ONLY. However, when I do this, and
>>> attempt to get the number of layers in the second data set, I get a whole
>>>
>>> lot of errors of the form:
>>> ERROR 4: Failed to open file <shapefile>.shp.
>>> It may be corrupt or read-only file accessed in update mode.
>>>
>>> ...for most (but not all) of the layers, and of course the dataset is
>>> incomplete and not useful.
>>>
>>> I've crafted the following very simple example of this problem:
>>> OGRDataSourceH firstDS = OGROpen(path, FALSE, NULL);
>>> OGRDataSourceH secondDS = OGROpen(path, FALSE, NULL);
>>> OGR_DS_GetLayerCount(firstDS); // THIS LINE WORKS FINE
>>> OGR_DS_GetLayerCount(secondDS); // THIS LINE PRODUCES MANY ERRORS
>>>
>>> If I OGR_DS_Destroy the first data set before running the
>>> OGR_DS_GetLayerCount on the second data set it works fine.
>>>
>>> Is this expected?
>>>
>>> I really need to have both datasets readable and useable simultaneously
>>> as they are both in completely independent parts of the application.
>>> The first data set should be long-lived and needs to be persistent
>>> before, during and after the entire short life-cycle of the second data
>>> set.
>>>
>>> The error messages imply that it is either corrupt or accessed in update
>>> mode. But clearly it is not corrupt (at the file level) because it works
>>> fine in the first data set (and in the second if the first data set is
>>> destroyed first). It is also being explicitly opened in READ-ONLY mode
>>> in both cases and therefore should not be in update mode.
>>>
>>> I'm using gdal-1.10.1.
>>>
>>> Any advice would be very much appreciated.
>>>
>>> Cheers,
>>> Nik.
>>>
>>> _______________________________________________
>>> gdal-dev mailing list
>>> gdal-dev at lists.osgeo.org
>>> http://lists.osgeo.org/mailman/listinfo/gdal-dev
>
> --
> Geospatial professional services
> http://even.rouault.free.fr/services.html
> _______________________________________________
> gdal-dev mailing list
> gdal-dev at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/gdal-dev
More information about the gdal-dev
mailing list