<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html; charset=ISO-8859-1"
 http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
Hi all, Hi Minrk,<br>
<br>
I'm not sure if I should post on IPython list or PyZMQ list,<br>
<br>
<b><big>Brief</big></b>: Usage of IPython parallel, I use DirectView
object to "execute" code on 32 engines and "pull" to retrieve results.<br>
Those results are simply compared (means read only) to some range limit
to know which engine got error and which pass.<br>
We repeat this, previous result are erase by new, so the memory
footprint on engines is constant.<br>
from the IPython Client side, after a long run (it depends on user
usage)<br>
- currently it is not very intensive but as the system is never
restarted after several weeks it crashed,<br>
- then it will be something like 1 execute every 1 or 3seconds followed
by a pull, I expect a crash within few days at this rhythm&nbsp;<span
 class="moz-smiley-s2"><span> :-( </span></span> .<br>
<br>
<b><big>TestCase</big></b>:<br>
-open a shell execute:<br>
&nbsp;&nbsp;&nbsp; ipcontroller --ip='*' --nodb<br>
-then open another shell to start 32 engines,&nbsp; I use python to do it:<br>
import time,os<br>
for i in range(32):<br>
&nbsp;&nbsp;&nbsp; os.popen("ipengine&amp;")<br>
&nbsp;&nbsp;&nbsp; time.sleep(1)<br>
-execute the script (README_script_test.py attached to this mail):<br>
<br>
When I started to debug and profile IPython internal method, I started
to insert some time.time() in each method involved in AsyncResult,
finally I pointed the client.py spin() method,<br>
as I don't want you to modify your installation, in the script provided
I define a myClient class which inherit from IPython.parallel.Client
and I override spin method to add the time.time() that help me to
figure out where the time is spent.<br>
Then it's a simple dview.execute to set a variable on all engines,
followed by a loop to retrieve the variable 1000 of times.<br>
a boolean WRITECSVFILE, can be set to True to open profiling data in
oocalc or excel<br>
a boolean TEST_MEMORY_ERROR, can be set to True, it just do more loops,
maybe need to be extended to reach the MemoryError but it's probably
not desired.<br>
<br>
<br>
<b><big>Issues</big></b>:<br>
1) with a result of type List, while I retrieve it a growing delay
appear every N ( 4 to 5 in case of 200 elements in list to pull with 32
engines, no matters if elements are float only or string only or mixed)
AsyncResult.get().<br>
&nbsp;&nbsp;&nbsp; I did some profiling, this is what the test script help to produce,
I also modified client.py<br>
&nbsp;&nbsp;&nbsp; <a href="http://i40.tinypic.com/1z6bpuh.png">http://i40.tinypic.com/1z6bpuh.png</a>&nbsp;&nbsp;
or &nbsp;&nbsp; <a class="underline" href="http://dl.free.fr/bvYnPT3rR"
 onclick="window.open('http://dl.free.fr/bvYnPT3rR'); return false;">http://dl.free.fr/bvYnPT3rR</a><br>
<br>
&nbsp;&nbsp;&nbsp; I managed to notice spin() method of the client.py in which the
_flush_results(self._mux_socket) seems to be where the time is spent,
but then I do see the pyzmq interface involved but I don't understand
what's wrong with it.<br>
<br>
2) memory usage keep growing, and finaly reach a MemoryError.<br>
&nbsp;&nbsp;&nbsp; no matter the type of data retrieved, numpy array, simple string,
float or a list.<br>
<br>
&nbsp;comments:<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; concerning 1)&nbsp; I understand the serialization following the type
of results, it takes more or less time to
retrieve, BUT if the time is rising pull after pull on the same result
(it seems to be only with List) something else is involved, and I don't
catch it.<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; concerning 2)&nbsp; I though the Hub Database could have been
involved, so when I start the ipcontroller I added --nodb, but I still
got the MemoryError, moreover this option concerns only the
ipcontroller app,<br>
<br>
also I tried&nbsp;&nbsp;&nbsp; rc.purge_results('all'), but didn't see any impact.<br>
are&nbsp;&nbsp;&nbsp; rc.history,&nbsp;&nbsp;&nbsp; dview.results, &nbsp;&nbsp; rc.session.digest_history or
other internal object should be cleared regularly?<br>
<br>
I read this:&nbsp; <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
<a class="moz-txt-link-freetext" href="http://ipython.org/ipython-doc/stable/parallel/parallel_details.html#non-copying-sends-and-numpy-arrays">http://ipython.org/ipython-doc/stable/parallel/parallel_details.html#non-copying-sends-and-numpy-arrays</a>
<h3>What is sendable (...)<br>
</h3>
(unless the data
is very small)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -----&gt; I'am not sure what that means, but if a
results is pulled twice, how to do to make the 2nd erase the 1st one.<br>
<br>
<br>
<b><big>Question</big></b>:<br>
any kind people who want give a try to the script I attached to confirm
the behaviour, any hint to avoid my IPython client process to slow
down, and reach a MemoryError, or do I miss a page in the manual about
clear the memory in the user application?<br>
in advance Thanks, keep the good works!<br>
<br>
<b>Environment</b>:<br>
Linux RHEL 5.5, python 2.6.6<br>
ipython 0.12, then upgrade to the latest git 0.13dev<br>
zmq+pyzmq 2.1.7, then upgrade to the latest zmq+pyzmq 2.1.11<br>
jsonlib2 &nbsp;&nbsp;&nbsp; 1.3.10<br>
<br>
Cheers,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Joe<br>
<pre class="moz-signature" cols="72">-- 
RICHARD Georges-Emmanuel
</pre>
</body>
</html>