<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal">Hi all,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I am using GDAL to read some geoid files in order to do some vertical datum transformations. The transformation engine I am using is done point by point transformations and doing a grid lookup for each point, so this means when transforming
 say a million points, it is doing a two million grid lookups (one for the source, and one for the destination).<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">After a performance profiling run, it became clear that much of the slowdown is because of mutexing. Most of the Geoid formats are based on the RawDataset, which is mutexing on every read for two different reasons. While one is about the
 accessing of the block cache, which for obvious reasons cannot be avoided, but, the biggest bottleneck was the CPLGetConfigOption("GDAL_ONE_BIG_READ") call in RawRasterBand::CanUseDirectIO(). I am wondering if it would make sense to move that call to the constructor
 and store the result for future use? Or, would we expect that setting to change during the lifetime of the raster, and the raster to react dynamically to those option changes?<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Since most geoids are really small grids, I opted to try to copy the geoid to a MEMDataset raster. That had the benefit of avoiding the CPLGetConfigOption() bottleneck and also avoiding the block cache. That being said, the memory raster
 is always set to an access mode of GA_Update. That means that reading will also try to acquire a mutex in GDALDataset::EnterReadWrite. Would it make sense to be able to either specify the access mode of a MEMDataset to GA_ReadOnly or to add a SetAccess() method
 to it similar to RawRasterBand so that it can be changed to read-only after the initial copy was done?<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Keep in mind that I am willing to make and contribute the necessary changes. I just want to get a feel as to what would make sense at the general level if any such changes are required. Also, do you have any other suggestions on how to
 avoid such mutexes when reading what is essentially static data?<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Kind regards,<o:p></o:p></p>
<p class="MsoNormal">Andr<span lang="FR-CA">é Vautour<o:p></o:p></span></p>
</div>
</body>
</html>