Note that in the parallel code, I do exactly what you mention.  <div><meta charset="utf-8">I added the buffers argument to session.send(), because it is critically important for the parallel code to be able to send things like numpy arrays without ever serializing or copying the raw data, and currently, I can do that - there are zero in-memory copies of array data (even from Python-&gt;C zmq); only over the network.  It also allows me to pickle arbitrary objects, and send them without having to ever copy the pickled string.  Metadata is sent via json, and on the back is a series of buffers containing any binary data.  I imagine that my Session object will be merged with the existing Session object once the Parallel code gets pulled into trunk, but that&#39;s a little while off.</div>

<div><br></div><div>Perhaps with the payload system, it would make sense for the kernel to use this new model.  Of course, it isn&#39;t perfectly universal, as web frontends require mime-type header info in order to interpret binary data, so you would probably fracture the portability of pure JSON, but I&#39;m not sure. Maybe the HTML header info can be in the JSON metadata in such a way that a javascript side would be able to properly interpret the data.</div>

<div><div><br></div><div>-MinRK</div><div><br></div><div><div class="gmail_quote">On Tue, Oct 19, 2010 at 16:17, Robert Kern <span dir="ltr">&lt;<a href="mailto:robert.kern@gmail.com">robert.kern@gmail.com</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div class="im">On 2010-10-19 17:34 , MinRK wrote:<br>
&gt;<br>
&gt;<br>
&gt; On Tue, Oct 19, 2010 at 15:05, Fernando Perez &lt;<a href="http://fperez.net" target="_blank">fperez.net</a><br>
</div><div class="im">&gt; &lt;<a href="http://fperez.net" target="_blank">http://fperez.net</a>&gt;@<a href="http://gmail.com" target="_blank">gmail.com</a> &lt;<a href="http://gmail.com" target="_blank">http://gmail.com</a>&gt;&gt; wrote:<br>


&gt;<br>
&gt;     On Sun, Oct 17, 2010 at 2:28 PM, Mark Voorhies &lt;<a href="mailto:mark.voorhies@ucsf.edu">mark.voorhies@ucsf.edu</a><br>
</div><div><div></div><div class="h5">&gt;     &lt;mailto:<a href="mailto:mark.voorhies@ucsf.edu">mark.voorhies@ucsf.edu</a>&gt;&gt; wrote:<br>
&gt;      &gt; I tried a first pass at this (branch &quot;pastefig&quot; in my github repository.<br>
&gt;      &gt; Latest commit:<br>
&gt;      &gt;<br>
&gt;     <a href="http://github.com/markvoorhies/ipython/commit/3f3d3d2f6e1f457856ce7e5481aa681fddb72a82" target="_blank">http://github.com/markvoorhies/ipython/commit/3f3d3d2f6e1f457856ce7e5481aa681fddb72a82</a><br>
&gt;      &gt; )<br>
&gt;<br>
&gt;     Thanks!!!<br>
&gt;<br>
&gt;      &gt; The multi-image bundle is sent as type &quot;multi&quot;, with data set to<br>
&gt;      &gt; a dict of &quot;format&quot;-&gt;data (so, currently,<br>
&gt;      &gt; {&quot;png&quot; : PNG data from matplotlib,<br>
&gt;      &gt; &quot;svg&quot; : SVG data from maptplotlib}<br>
&gt;      &gt; )<br>
&gt;      &gt; [&quot;multi&quot; is probably not the best name choice -- any suggestions for<br>
&gt;      &gt;  something more descriptive/specific?]<br>
&gt;<br>
&gt;     It may be time to stop for a minute to think about our payloads.  The<br>
&gt;     payload system works well but we&#39;ve known all along that once we have<br>
&gt;     a clearer understanding of what we need, we&#39;d want to refine its<br>
&gt;     design.  All along something has been telling me that we should move<br>
&gt;     to a full specification of payloads with mimetype information (plus<br>
&gt;     possibly ipython-specific extra data).  Python has a mimetype library,<br>
&gt;     and if our payloads are properly mimetype-encoded, web frontends would<br>
&gt;     have little to no extra work to do, as browsers are already tooled up<br>
&gt;     to handle gracefully mimetype-tagged data that comes in.<br>
&gt;<br>
&gt;     What do people think of this approach?<br>
&gt;<br>
&gt;      &gt; Naively sending PNG data causes reply_socket.send_json(repy_msg)<br>
&gt;      &gt; in ipkernel.py to hang (clearing the eighth bit of the data fixes this,<br>
&gt;      &gt; does ZMQ require 7bit data?) -- I&#39;m currently working around this by<br>
&gt;      &gt; base64 encoding the PNG, but this may not be the best choice wrt<br>
&gt;      &gt; bandwidth.<br>
&gt;<br>
&gt;     That&#39;s very odd.  Brian, Min, do you know of any such restrictions in<br>
&gt;     zmq/pyzmq?  I thought that zmq would happily handle pretty much any<br>
&gt;     binary data...<br>
&gt;<br>
&gt;<br>
&gt; Sorry, I sent this a few days ago, but failed to reply-all:<br>
&gt;<br>
&gt; It&#39;s not zmq, but json that prevents sending raw data.  ZMQ can send any bytes<br>
&gt; just fine (I tested with the code being used to deliver the payloads, and it can<br>
&gt; send StringIO from a PNG canvas no problem), but json requires encoded strings.<br>
&gt;   Arbitrary C-strings are not necessarily valid JSON strings. This gets<br>
&gt; confusing, but essentially JSON has the same notion of strings as Python-3<br>
&gt; (str=unicode, bytes=C-str).  A string for them is a series of /characters/, not<br>
&gt; any series of 8-bit numbers, which is the C/Python&lt;3 notion. Since not all<br>
&gt; series of arbitrary 8-bit numbers can be interpreted as valid characters, JSON<br>
&gt; can&#39;t encode them for marshaling. Zeroing out the 8th bit works because all<br>
&gt; 7-bit numbers /are/ valid ASCII characters (and thus also valid in almost all<br>
&gt; encodings).<br>
&gt;<br>
&gt; JSON has no binary data format. The only valid data for JSON are: numbers,<br>
&gt; encoded strings, lists, dicts, and lists/dicts of those 4 types, so if you want<br>
&gt; to send binary data, you have to first turn it into an *encoded* string, not a<br>
&gt; C-string.  Base64 is an example of such a thing, and I don&#39;t know of a better<br>
&gt; way than that, if JSON is enforced. Obviously, if you used pickle instead, there<br>
&gt; would be no problem<br>
&gt;<br>
&gt; This is why BSON (the data format used by MongoDB among others) exists. It adds<br>
&gt; binary data support to JSON.<br>
<br>
</div></div>The approach I advocated at SciPy was to use multipart messages. Send the header<br>
encoded in JSON (or whatever) and then follow that with a message part (or<br>
parts) containing the binary data. Don&#39;t try to encode the data inside any kind<br>
of markup requiring parsing, whether the format is binary-friendly or not. This<br>
lets the receiver parse just the smallish header and decide what to do with the<br>
largish data without touching the data. You don&#39;t want to parse all of a BSON<br>
message just to find out that it&#39;s a PNG when you want the SVG.<br>
<div class="im"><br>
--<br>
Robert Kern<br>
<br>
&quot;I have come to believe that the whole world is an enigma, a harmless enigma<br>
  that is made terrible by our own mad attempt to interpret it as though it had<br>
  an underlying truth.&quot;<br>
   -- Umberto Eco<br>
<br>
_______________________________________________<br>
</div><div><div></div><div class="h5">IPython-dev mailing list<br>
<a href="mailto:IPython-dev@scipy.org">IPython-dev@scipy.org</a><br>
<a href="http://mail.scipy.org/mailman/listinfo/ipython-dev" target="_blank">http://mail.scipy.org/mailman/listinfo/ipython-dev</a><br>
</div></div></blockquote></div><br></div></div>