Packaging the json string as a vector of u8 integers worked like a charm,
thank you for the suggestion!

Python code:
https://gist.github.com/regulatre/38e7162d6f470ad0dbd77b171a69dc79
C++ block code:
https://gist.github.com/regulatre/f264fb4751ca3bd8d6b98abf9792e95d

Memory consumption by the python flowgraph is no longer showing signs of
memory leakage (at least in the 4 hours it's been running :)


On Fri, Mar 1, 2019 at 1:50 PM Müller, Marcus (CEL) <muel...@kit.edu> wrote:

> Hi Brad,
>
> so, yes, your observation is correct: PMT symbols are/were meant to be
> used as "identifiers", not as "data carriers"; the motivation behind
> the hash table you find in pmt.cc is that there's only one instance of
> any given PMT symbol, and thus, a simple address comparison suffices to
> tell whether two PMT symbols are the same.
>
> You'll notice that on x86 (and presumably modern ARM) string comparison
> is pretty fast, and that you'd need to do *a lot* comparisons to offset
> the cost of hashing a symbol once. Anyway, yes, that table grows
> unboundedly.
>
> Since your string isn't actually a "symbol", I'd recommend simply
> encoding it safely (that's probably already the case), and putting it
> in a uniform PMT vector of 8bit integers (u8vector).
>
> On a different note, there's actually "unintended" (as in: I don't
> intend GNU Radio to have an unbounded hash map, but it's at least what
> was originally intended) memory leaks with PMTs and tag_t on the
> Python/C++ boundary, and there's quite some broken concepts within PMT.
>
> Long or medium term, we'll be replacing PMT with something that is
> actually a common serialization format for usage in external software
> (i.e. not for usage within the same flow graph), and ideally with the
> unserialized universal container that comes with such a format. Stay
> tuned. However, not happening in 3.8 or anything before.
>
> Best regards,
> Marcus
>
> On Thu, 2019-02-28 at 14:48 -0500, Brad Hein wrote:
> >
> > In my gnuradio test application I’m attempting to pass a JSON formatted
> string from my C++ custom block, to my python flow graph containing the
> block.
> >
> > The String message are being received by my python flow graph, but
> there’s a memory leak. Over time, my flowgraph RSS (memory footprint) grows
> at about 32k/s up until the application runs out of memory.
> >
> > The leak didn’t start until after I retrofitted my flowgraph and custom
> block with polymorphic type (PMT) based message passing. I’m passing a 200
> or so byte JSON string (as a symbol) from C++ block to python flow graph
> about 60 times per second.
> >
> > Sleuthing through the pmt.cc code [1] I see the String (symbol) objects
> are stored in a hash. I suspect what is happening is that since all of my
> JSON strings are unique, they’re getting added to the hash and causing the
> hash to grow unbounded over time.
> >
> > From what I can tell by reading the wiki [2], the approach I’m using is
> the best way to get a string from my custom block and into my python
> flowgraph.
> >
> > [1]
> https://github.com/gnuradio/gnuradio/blob/master/gnuradio-runtime/lib/pmt/pmt.cc
> > [2] https://www.gnuradio.org/doc/doxygen/page_pmt.html
> >
> >
> > Sample c++ block code snippet from my work function:
> >
> > // Calculate metrics. Occasionally (60/second) we'll get back a JSON
> formatted string of metrics.
> > crossingData = calculateWaveCrossingMetrics(lastSampleValue,in[i]);
> >
> > if (crossingData.length() > 0) {
> >   pmt::pmt_t messageString;
> >   messageString = pmt::string_to_symbol(crossingData.c_str());
> >   message_port_pub(polymorphicMessageDestination, messageString);
> >
> >
> > Questions:
> >
> > 1.     Is this the best way to get a string from my C++ block into my
> python application?
> > 2.     Is there a way to pass my messages that doesn’t result in memory
> growing unbounded?
> >
> >
> > Thank you
> > Brad
> >
> > _______________________________________________
> > Discuss-gnuradio mailing list
> > Discuss-gnuradio@gnu.org
> > https://lists.gnu.org/mailman/listinfo/discuss-gnuradio
>
_______________________________________________
Discuss-gnuradio mailing list
Discuss-gnuradio@gnu.org
https://lists.gnu.org/mailman/listinfo/discuss-gnuradio

Reply via email to