#2750: LZ4 when writing raster rows; better than double I/O bound r.mapcalc 
speed
--------------------------+---------------------------
  Reporter:  sprice       |      Owner:  grass-dev@…
      Type:  enhancement  |     Status:  new
  Priority:  normal       |  Milestone:  7.1.0
 Component:  Raster       |    Version:  svn-trunk
Resolution:               |   Keywords:  ZLIB LZ4 ZSTD
       CPU:  OSX/Intel    |   Platform:  MacOSX
--------------------------+---------------------------

Comment (by wenzeslaus):

 In the diff I see the following pattern (this if from
 [source:grass/trunk/lib/raster/get_row.c#L84 lib/raster/get_row.c],
 `read_data_fp_compressed()` function):

 {{{
 #!diff
 -    if ((size_t) G_zlib_read(fcb->data_fd, readamount, data_buf, bufsize)
 != bufsize)
 +    cmp = G_alloca(readamount);
 +
 +    if (read(fcb->data_fd, cmp, readamount) != readamount) {
 +        G_freea(cmp);
         G_fatal_error(_("Error reading raster data for row %d of <%s>"),
                       row, fcb->name);
  }

 +    if (cmp[0] == '0') // flate.c::G_ZLIB_COMPRESSED_NO
 +        // Uncompressed
 +        memcpy(data_buf, cmp+1, bufsize);
 +    else
 +        if (cmp[0] == 3 || cmp[0] == 4)
 +//          LZ4_decompress_safe((char *)(cmp+1), (char *)data_buf,
 +//                              readamount-1, bufsize);
 +        LZ4_decompress_fast((char *)(cmp+1), (char *)data_buf, bufsize);
 +    else if (cmp[0] == 5)
 +        ZSTD_decompress(data_buf, bufsize, cmp+1, readamount-1);
 +    else
 +        G_zlib_expand(cmp+1, readamount-1, data_buf, bufsize);
 +
 +    G_freea(cmp);
 +}
 }}}

 In words, `G_zlib_read()` function is replaced by a block of code. Similar
 applies to `G_zlib_write()` function and to certain extent to
 `G_zlib_expand()` and `zlib_compress()` as well.

 My question is if it wouldn't be more advantageous to create some wrapper
 which would take the all necessary inputs including compression type and
 do the necessary switches and format specific things.

 I suppose this would make easier to add the same compression options also
 to 3D raster library where `G_zlib_read()` and `G_zlib_write()` functions
 are already used ([source:grass/trunk/lib/raster3d/fpcompress.c#L718
 lib/raster3d/fpcompress.c]) or perhaps even to some other code such as
 [source:grass/trunk/lib/segment lib/segment] where no compression is used.

--
Ticket URL: <https://trac.osgeo.org/grass/ticket/2750#comment:13>
GRASS GIS <https://grass.osgeo.org>

_______________________________________________
grass-dev mailing list
[email protected]
http://lists.osgeo.org/mailman/listinfo/grass-dev

Reply via email to