<div dir="ltr"><div dir="ltr">Hi,<div><br></div><div>I don't know what your problem might be.  In the past I have done timing of stream/standard mode and they've been comparable.  I don't think we've changed anything recently that would impact LAS reading performance unless there's more to your code than you've shown.  I don't know what memory would be allocated in 3MB chunks.  Generally, PDAL doesn't allocate heap memory during the read process.</div><div><br></div><div>A couple of thoughts:</div><div><br></div><div>1) Rather than call prepare() on the stage, you can call preview().  This returns a structure that contains the point count.  I don't think this should have any impact on performance.</div><div>2) In order to debug, I would eliminate your processing code, whatever that might be, just to simplify.  There are suggestions in the non-streaming code that you are threading things in a way that we simply can't see or analyze.</div><div><br></div><div>If you can pin things down better, please let me know and I can take a look.</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, May 16, 2019 at 3:58 PM KB-Vis Technologies Pvt. Ltd. <<a href="mailto:3d@kbvis.com">3d@kbvis.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><p>Greetings,</p><p>I have a huge performance issue with reading LAS
points on large files.</p><p>I initially implemented a non-streaming read
using PointViewSet as in the examples, and this worked fine. However
on larger LAS files e.g. a 1GB file with 150 million points, the memory
usage would go up to 15GB, and the load would take around 3-5
minutes.</p><p>Then, I switched to a streaming read
using FixedPointTable and StreamCallbackFilter. This uses much less
memory but is VERY slow. The 150 million points take 15+ minutes to
load..The issue seems to be that memory is being allocated in increments
of 3MB, and this takes forever. tried various values for the
FixedPointTable size, but this seems to have no effect.</p><p>I would
prefer to use the streaming approach to do fast low-res partial reads etc.
and to keep the memory usage down, if only I could improve the loading
time.</p><p>I am using PDAL 1.7.2. I was wondering if I am doing something
very wrong, or whether I should just update to 1.9</p><p>Any advice would
be hugely appreciated!</p><p>many thanks,</p><p>Karthik
Bala</p><p> </p><p>My code:</p><p><strong>Original Non-Streaming
reader (FAST but memory-intensive)</strong></p>
<div>
        pdal::Option las_opt("filename", sFilenames[f]);</div>
<div>
        pdal::Options las_opts;</div>
<div>
        las_opts.add(las_opt);</div>
<div>
        LasReader *sLasReader = new LasReader();</div>
<div>
        sLasReader->setOptions(las_opts);</div>
<div>
        PointTable *sTable = new PointTable();</div>
<div>
        sLasReader->prepare(*sTable);</div>
<div>
        PointViewSet sPointViewSet = sLasReader->execute(*sTable);</div>
<div>
        PointViewPtr sPointView = *sPointViewSet.begin();</div>
<div>
        Dimension::IdList sDims = sPointView->dims();</div>
<div>
         </div>
<div>
        int pointCount = sLasReader->getNumPoints();</div>
<div>
        int chunkSize = pointCount / threadCount;</div>
<div>
         </div>
<div>
        parallel_for(0, threadCount, [&](int i) {</div>
<div>
         </div>
<div>
        pdal::PointId start = i*chunkSize;</div>
<div>
        pdal::PointId end = (i == 0 || i < threadCount - 1) ? (i +
1)*chunkSize : pointCount;</div>
<div>
         </div>
<div>
        for (pdal::PointId idx = start; idx < end; ++idx) {</div>
<div>
        double x = sPointView->getFieldAs<double>(Id::X, idx) -
spOffsetpunkt.x;</div>
<div>
        double y = sPointView->getFieldAs<double>(Id::Y, idx) -
spOffsetpunkt.y;</div>
<div>
        double z = sPointView->getFieldAs<double>(Id::Z, idx) -
spOffsetpunkt.z;</div>
<div>
        int red = sPointView->getFieldAs<int>(Id::Red, idx);</div>
<div>
        int green = sPointView->getFieldAs<int>(Id::Green, idx);</div>
<div>
        int blue = sPointView->getFieldAs<int>(Id::Blue, idx);</div>
<div>
        <div>
                 </div>
        <div>
                //... process point</div>
</div>
<div>
         </div>
<div>
        }</div>
<div>
        });</div>
<p> </p>
<div>
        <p><strong>Streaming Callback reader (Low memory footprint, but
SLOW):</strong></p>
        <div>
                pdal::Option las_opt("filename", string(filename));</div>
        <div>
                pdal::Options las_opts;</div>
        <div>
                las_opts.add(las_opt);</div>
        <div>
                LasReader sLasReader;</div>
        <div>
                sLasReader.setOptions(las_opts);</div>
        <div>
                PointTable sTable;</div>
        <div>
                sLasReader.prepare(sTable);</div>
        <div>
                 </div>
        <div>
                int pointCount = sLasReader->getNumPoints();</div>
        <div>
                 </div>
        <div>
                auto cb = [&](PointRef& point) {</div>
        <div>
                 </div>
        <div>
                double x = point.getFieldAs<double>(Id::X) - spOffsetpunkt.x;</div>
        <div>
                double y = point.getFieldAs<double>(Id::Y) - spOffsetpunkt.y;</div>
        <div>
                double z = point.getFieldAs<double>(Id::Z) - spOffsetpunkt.z;</div>
        <div>
                 </div>
        <div>
                int red = point.getFieldAs<int>(Id::Red);</div>
        <div>
                int green = point.getFieldAs<int>(Id::Green);</div>
        <div>
                int blue = point.getFieldAs<int>(Id::Blue);</div>
        <div>
                 </div>
        <div>
                //... process point</div>
        <div>
                 </div>
        <div>
                return true;</div>
        <div>
                };</div>
        <div>
                 </div>
        <div>
                pdal::Option las_opt("filename", sFilename);</div>
        <div>
                pdal::Options las_opts;</div>
        <div>
                las_opts.add(las_opt);</div>
        <div>
                LasReader sLasReader;</div>
        <div>
                sLasReader.setOptions(las_opts);</div>
        <div>
                 </div>
        <div>
                FixedPointTable t(1000);</div>
        <div>
                StreamCallbackFilter scf;</div>
        <div>
                scf.setCallback(cb);</div>
        <div>
                scf.setInput(sLasReader);</div>
        <div>
                scf.prepare(t);</div>
        <div>
                scf.execute(t);</div>
        <div>
                 </div>
        <div>
                 </div>
</div>
_______________________________________________<br>
pdal mailing list<br>
<a href="mailto:pdal@lists.osgeo.org" target="_blank">pdal@lists.osgeo.org</a><br>
<a href="https://lists.osgeo.org/mailman/listinfo/pdal" rel="noreferrer" target="_blank">https://lists.osgeo.org/mailman/listinfo/pdal</a></blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature">Andrew Bell<br><a href="mailto:andrew.bell.ia@gmail.com" target="_blank">andrew.bell.ia@gmail.com</a></div></div>