Hi,

I'm not entirely certain this is really a Wx::Perl::ProcessStream issue.

For sure, it is Wx::Perl::ProcessStream consuming the memory. I am not sure it is a fault in Wx::Perl::ProcessStream that causes perl to allocate additional memory when additional processes are run.

I will have to run some tests at some point to confirm this or fix problem.

However, you can limit the memory consumed by Wx::Perl::ProcessStream.

In addition to passing out each line in an event, the module stores lines in a buffer for later retrieval. Accessing the contents of this buffer clears it.

So - for your purposes, in your event handlers

sub _evt_stdout {
.....
  $event->GetProcess->GetStdOutBuffer;
.....
}

sub _evt_stderr {
.....
  $event->GetProcess->GetStdErrBuffer;
.....
}

should reduce memory consumption on each process.

Regards

Mark


Cornelius Bartke wrote:
Hi there.

I have a question about Wx::Perl::ProcessStream and memory usage.

My background is a long running GUI application that (from time to time) 
executes external commands, for example running rsync processes. In my GUI I'd 
like to give some feedback about what is happening. My plan was to have 
Wx::Perl::ProcessStream runs the rsync command and to use an eventhandler for 
STDOUT to process the output of a dry run (basically a long list of filenames).

However, while processing the output, W:P:PS seems to allocate memory and 
running a rsync process again does not reuse the memory. Per 10.000 lines of 
STDOUT processed, my process grows by 45MB (Debian Lenny, perl 5.10, Wx v0.92, 
wxWidgets 2.6.3.2, on winXP it is 33MB but basically the same problem). I have 
built a test case (attached) to illustrate the behaviour. Just run a command 
that produces output on STDOUT a few times in a row and watch the memory usage 
of the perl process (using top or process manager).

Now my questions:
* is my usage of W:P:PS "correct" or am I misunderstanding the concept?
* is this a known problem? I found nothing on the net so far.
* is there a way force W:P:PS ro release allocated memory back to perl once it 
has processed STDOUT and the external process terminated?
* do you have any other suggestions how to handle the scenario outlined above?

I've had a look at Padre's background task handling but I wanted to avoid 
having to use threads ...

Any help or pointers are appreciated!

-Cornelius



Reply via email to