<div dir="ltr">Thanks for the explanation Dave.<div><br></div><div>It was definitely still doing something, as it was consuming 100% CPU and rose to 12GB memory usage (and was still climbing) within a few minutes before I killed it.  Not sure what would cause it to gobble memory like that on such a small file though.</div><div><br></div><div>I&#39;m satisfied with using the indexing syntax and as you said, it is preferable in almost all use cases.</div><div><br></div><div>Thanks</div><div>Jason</div><div><br></div><div><div class="gmail_extra"><div><div class="gmail_signature"><div dir="ltr"><div><div><div><br></div></div></div></div></div></div>
<br><div class="gmail_quote">On Thu, Dec 31, 2015 at 1:48 PM, David Brown <span dir="ltr">&lt;<a href="mailto:dbrown@ucar.edu" target="_blank">dbrown@ucar.edu</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I am not totally sure what is going on here, but I can tell you that<br>
for PyNIO, as for its predecessor, Konrad Hinson&#39;s scientific NetCDF<br>
package, the design was that you needed to &quot;dereference&quot; the<br>
NioVariable object using indexing syntax to get the NumPyarray values.<br>
But the NioVariable object always supported the Python Sequence<br>
protocol, and I believe that at some point, support for the Sequence<br>
protocol in numpy was enhanced in a way that allowed NumPy arrays to<br>
be derived from NioVariable objects. This was without any explicit<br>
changes to support this feature in PyNIO.<br>
<br>
However, in my experience, trying to use this in practice has<br>
extremely bad performance, because NumPy has no real knowledge of the<br>
data that the NioVariable object refers to, and consequently it asks<br>
for array elements one at a time. For anything but very small datasets<br>
this is extremely inefficient. The chances are that your example with<br>
1.5.0-beta did not actually fail. It was just taking an extremely long<br>
time.<br>
But given this, I was not aware of a difference in performance between<br>
1.4.1 and 1.5.0-beta. We can investigate, but as I said, this was<br>
never an intended feature of PyNIO, but arose from later developments<br>
in numpy.<br>
 -dave<br>
<div><div class="h5"><br>
On Tue, Dec 29, 2015 at 11:54 AM, Jason Greenlaw - NOAA Affiliate<br>
&lt;<a href="mailto:jason.greenlaw@noaa.gov">jason.greenlaw@noaa.gov</a>&gt; wrote:<br>
&gt; Hi Heather,<br>
&gt;<br>
&gt; Yes, it is an NioVariable object.  Seems that at 1.4.1, NioVariable provided<br>
&gt; some numpy functionality from the object itself rather than requiring you to<br>
&gt; extract the numpy array first.<br>
&gt;<br>
&gt; I am not an expert with PyNIO/numpy and this code was written by someone<br>
&gt; else, but I was under the impression NioVariable provided access to the<br>
&gt; arrays via an iterator (i.e. lazy loading), which would be preferable in<br>
&gt; some cases to loading the entire arrays into memory using numpy indexing.<br>
&gt; But I could be totally off base there.<br>
&gt;<br>
&gt; Output is below.<br>
&gt;<br>
&gt; Thanks,<br>
&gt; Jason<br>
&gt;<br>
&gt;<br>
&gt; $ python<br>
&gt; Python 2.7.2 (default, May  7 2012, 16:54:01)<br>
&gt; [GCC 4.4.5 20110214 (Red Hat 4.4.5-6)] on linux2<br>
&gt; Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.<br>
&gt;&gt;&gt;&gt; import Nio<br>
&gt;&gt;&gt;&gt; import numpy<br>
&gt;&gt;&gt;&gt; Nio.__version__<br>
&gt; &#39;1.4.1&#39;<br>
&gt;&gt;&gt;&gt; numpy.__version__<br>
&gt; &#39;1.6.1&#39;<br>
&gt;&gt;&gt;&gt; f = Nio.open_file(&quot;<a href="http://glofs.leofs.fields.nowcast.20151229.t12z.nc" rel="noreferrer" target="_blank">glofs.leofs.fields.nowcast.20151229.t12z.nc</a>&quot;, &quot;r&quot;)<br>
&gt;&gt;&gt;&gt; m = f.variables[&quot;mask&quot;]<br>
&gt;&gt;&gt;&gt; m<br>
&gt; &lt;Nio.NioVariable object at 0x2290050&gt;<br>
&gt;&gt;&gt;&gt; print type(m)<br>
&gt; &lt;class &#39;Nio.NioVariable&#39;&gt;<br>
&gt;&gt;&gt;&gt; m.shape<br>
&gt; (24, 81)<br>
&gt;&gt;&gt;&gt; m_contents = m[:,:]<br>
&gt;&gt;&gt;&gt; print type(m_contents)<br>
&gt; &lt;type &#39;numpy.ndarray&#39;&gt;<br>
&gt;&gt;&gt;&gt; numpy.ma.masked_equal(m, 1.0)<br>
&gt; masked_array(data =<br>
&gt;  [[0.0 0.0 0.0 ..., 0.0 0.0 0.0]<br>
&gt;  [0.0 0.0 0.0 ..., 0.0 0.0 0.0]<br>
&gt;  [0.0 0.0 0.0 ..., 0.0 0.0 0.0]<br>
&gt;  ...,<br>
&gt;  [0.0 0.0 0.0 ..., 0.0 0.0 0.0]<br>
&gt;  [0.0 0.0 0.0 ..., 0.0 0.0 0.0]<br>
&gt;  [0.0 0.0 0.0 ..., 0.0 0.0 0.0]],<br>
&gt;              mask =<br>
&gt;  [[False False False ..., False False False]<br>
&gt;  [False False False ..., False False False]<br>
&gt;  [False False False ..., False False False]<br>
&gt;  ...,<br>
&gt;  [False False False ..., False False False]<br>
&gt;  [False False False ..., False False False]<br>
&gt;  [False False False ..., False False False]],<br>
&gt;        fill_value = 1.0)<br>
&gt;<br>
&gt;&gt;&gt;&gt; numpy.ma.masked_equal(m_contents, 1.0)<br>
&gt; masked_array(data =<br>
&gt;  [[0.0 0.0 0.0 ..., 0.0 0.0 0.0]<br>
&gt;  [0.0 0.0 0.0 ..., 0.0 0.0 0.0]<br>
&gt;  [0.0 0.0 0.0 ..., 0.0 0.0 0.0]<br>
&gt;  ...,<br>
&gt;  [0.0 0.0 0.0 ..., 0.0 0.0 0.0]<br>
&gt;  [0.0 0.0 0.0 ..., 0.0 0.0 0.0]<br>
&gt;  [0.0 0.0 0.0 ..., 0.0 0.0 0.0]],<br>
&gt;              mask =<br>
&gt;  [[False False False ..., False False False]<br>
&gt;  [False False False ..., False False False]<br>
&gt;  [False False False ..., False False False]<br>
&gt;  ...,<br>
&gt;  [False False False ..., False False False]<br>
&gt;  [False False False ..., False False False]<br>
&gt;  [False False False ..., False False False]],<br>
&gt;        fill_value = 1.0)<br>
&gt;<br>
&gt;<br>
&gt; --<br>
&gt; Jason Greenlaw<br>
&gt; Software Developer, ERT, Inc.<br>
&gt; NOAA/NOS/OCS/CSDL<br>
&gt; <a href="http://nowcoast.noaa.gov" rel="noreferrer" target="_blank">http://nowcoast.noaa.gov</a><br>
&gt; <a href="mailto:Jason.Greenlaw@noaa.gov">Jason.Greenlaw@noaa.gov</a><br>
&gt;<br>
&gt;<br>
&gt; On Tue, Dec 29, 2015 at 1:19 PM, Cronk,Heather &lt;<a href="mailto:Heather.Cronk@colostate.edu">Heather.Cronk@colostate.edu</a>&gt;<br>
&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; Hi Jason,<br>
&gt;&gt;<br>
&gt;&gt; I am a PyNIO user, not a developer so I can’t speak to any intentionality,<br>
&gt;&gt; but I am more surprised that your code works with version PyNIO version<br>
&gt;&gt; 1.4.1 than that it does’t work with the beta. I don’t have the old version<br>
&gt;&gt; anymore, but I am curious the output of type(m) with your original code? I<br>
&gt;&gt; was under the impression that the call f.variables[&quot;mask”] had always<br>
&gt;&gt; produced a Nio object and not a numpy array. Using the beta version I see<br>
&gt;&gt; this:<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; m_obj = f.variables[&quot;mask&quot;]<br>
&gt;&gt;<br>
&gt;&gt; print type(m_obj)<br>
&gt;&gt;<br>
&gt;&gt; &gt;&gt;  &lt;class &#39;Nio.NioVariable&#39;&gt;<br>
&gt;&gt;<br>
&gt;&gt; m_contents = f.variables[&quot;mask&quot;][:]<br>
&gt;&gt;<br>
&gt;&gt; print type(m_contents)<br>
&gt;&gt;<br>
&gt;&gt; &gt;&gt;  &lt;type &#39;numpy.ndarray’&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; What does the corresponding code produce with the 1.4.1?<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; Thanks!<br>
&gt;&gt;<br>
&gt;&gt; Heather<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; From: &lt;<a href="mailto:pyngl-talk-bounces@ucar.edu">pyngl-talk-bounces@ucar.edu</a>&gt; on behalf of Jason Greenlaw - NOAA<br>
&gt;&gt; Affiliate &lt;<a href="mailto:jason.greenlaw@noaa.gov">jason.greenlaw@noaa.gov</a>&gt;<br>
&gt;&gt; Date: Tuesday, December 29, 2015 at 10:36 AM<br>
&gt;&gt; To: &quot;<a href="mailto:pyngl-talk@ucar.edu">pyngl-talk@ucar.edu</a>&quot; &lt;<a href="mailto:pyngl-talk@ucar.edu">pyngl-talk@ucar.edu</a>&gt;<br>
&gt;&gt; Subject: [pyngl-talk] PyNIO 1.5.0 Beta vs 1.4.1 - NetCDF Variable Access<br>
&gt;&gt; and Numpy<br>
&gt;&gt;<br>
&gt;&gt; Hello,<br>
&gt;&gt;<br>
&gt;&gt; I recently installed the 1.5.0 beta versions of PyNGL and PyNIO (using<br>
&gt;&gt; 64-bit binaries for CentOS6) and attempted to run some existing code, but<br>
&gt;&gt; encountered an issue when numpy functions (e.g. numpy.ma.masked_equal()) are<br>
&gt;&gt; called with NioVariable object arguments.<br>
&gt;&gt;<br>
&gt;&gt; At PyNIO v1.4.1/numpy1.6.1 I was able to do the following:<br>
&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; import Nio<br>
&gt;&gt; &gt;&gt;&gt; Nio.__version__<br>
&gt;&gt; &#39;1.4.1&#39;<br>
&gt;&gt; &gt;&gt;&gt; import numpy<br>
&gt;&gt; &gt;&gt;&gt; numpy.__version__<br>
&gt;&gt; &#39;1.6.1&#39;<br>
&gt;&gt; &gt;&gt;&gt; f = Nio.open_file(&quot;<a href="http://glofs.leofs.fields.nowcast.20151229.t12z.nc" rel="noreferrer" target="_blank">glofs.leofs.fields.nowcast.20151229.t12z.nc</a>&quot;, &quot;r&quot;)<br>
&gt;&gt; &gt;&gt;&gt; m = f.variables[&quot;mask&quot;]<br>
&gt;&gt; &gt;&gt;&gt; numpy.ma.masked_equal(m, 1.0)<br>
&gt;&gt; masked_array(data =<br>
&gt;&gt;  [[0.0 0.0 0.0 ..., 0.0 0.0 0.0]<br>
&gt;&gt;  [0.0 0.0 0.0 ..., 0.0 0.0 0.0]<br>
&gt;&gt;  [0.0 0.0 0.0 ..., 0.0 0.0 0.0]<br>
&gt;&gt;  ...,<br>
&gt;&gt;  [0.0 0.0 0.0 ..., 0.0 0.0 0.0]<br>
&gt;&gt;  [0.0 0.0 0.0 ..., 0.0 0.0 0.0]<br>
&gt;&gt;  [0.0 0.0 0.0 ..., 0.0 0.0 0.0]],<br>
&gt;&gt;              mask =<br>
&gt;&gt;  [[False False False ..., False False False]<br>
&gt;&gt;  [False False False ..., False False False]<br>
&gt;&gt;  [False False False ..., False False False]<br>
&gt;&gt;  ...,<br>
&gt;&gt;  [False False False ..., False False False]<br>
&gt;&gt;  [False False False ..., False False False]<br>
&gt;&gt;  [False False False ..., False False False]],<br>
&gt;&gt;        fill_value = 1.0)<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; However at PyNIO 1.5.0 beta/numpy 1.9.2, the numpy function call hangs,<br>
&gt;&gt; and the process begins consuming memory at an exponential rate until the<br>
&gt;&gt; call is interrupted.<br>
&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; import Nio<br>
&gt;&gt; &gt;&gt;&gt; Nio.__version__<br>
&gt;&gt; &#39;1.5.0-beta&#39;<br>
&gt;&gt; &gt;&gt;&gt; import numpy<br>
&gt;&gt; &gt;&gt;&gt; numpy.__version__<br>
&gt;&gt; &#39;1.9.2&#39;<br>
&gt;&gt; &gt;&gt;&gt; f = Nio.open_file(&quot;<a href="http://glofs.leofs.fields.nowcast.20151229.t12z.nc" rel="noreferrer" target="_blank">glofs.leofs.fields.nowcast.20151229.t12z.nc</a>&quot;, &quot;r&quot;)<br>
&gt;&gt; &gt;&gt;&gt; m = f.variables[&quot;mask&quot;]<br>
&gt;&gt; &gt;&gt;&gt; numpy.ma.masked_equal(m, 1.0)<br>
&gt;&gt; ^C^CTraceback (most recent call last):<br>
&gt;&gt;   File &quot;&lt;stdin&gt;&quot;, line 1, in &lt;module&gt;<br>
&gt;&gt;   File &quot;/opt/pyngl/python/lib/python2.7/site-packages/numpy/ma/core.py&quot;,<br>
&gt;&gt; line 1982, in masked_equal<br>
&gt;&gt;     output = masked_where(equal(x, value), x, copy=copy)<br>
&gt;&gt;   File &quot;/opt/pyngl/python/lib/python2.7/site-packages/numpy/ma/core.py&quot;,<br>
&gt;&gt; line 928, in __call__<br>
&gt;&gt;     (da, db) = (getdata(a, subok=False), getdata(b, subok=False))<br>
&gt;&gt;   File &quot;/opt/pyngl/python/lib/python2.7/site-packages/numpy/ma/core.py&quot;,<br>
&gt;&gt; line 667, in getdata<br>
&gt;&gt;     data = np.array(a, copy=False, subok=subok)<br>
&gt;&gt;   File &quot;/opt/pyngl/python/lib/python2.7/site-packages/PyNIO/Nio.py&quot;, line<br>
&gt;&gt; 325, in __getitem__<br>
&gt;&gt;     ret = get_variable(self.file, self.varname, xsel)<br>
&gt;&gt;   File &quot;/opt/pyngl/python/lib/python2.7/site-packages/PyNIO/coordsel.py&quot;,<br>
&gt;&gt; line 60, in get_variable<br>
&gt;&gt;     ret = file.file.variables[varname][xsel]<br>
&gt;&gt; KeyboardInterrupt<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; But if I change the call to use numpy indexing, it works:<br>
&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; m.shape<br>
&gt;&gt; (24, 81)<br>
&gt;&gt; &gt;&gt;&gt; numpy.ma.masked_equal(m[:,:], 1.0)<br>
&gt;&gt; masked_array(data =<br>
&gt;&gt;  [[0.0 0.0 0.0 ..., 0.0 0.0 0.0]<br>
&gt;&gt;  [0.0 0.0 0.0 ..., 0.0 0.0 0.0]<br>
&gt;&gt;  [0.0 0.0 0.0 ..., 0.0 0.0 0.0]<br>
&gt;&gt;  ...,<br>
&gt;&gt;  [0.0 0.0 0.0 ..., 0.0 0.0 0.0]<br>
&gt;&gt;  [0.0 0.0 0.0 ..., 0.0 0.0 0.0]<br>
&gt;&gt;  [0.0 0.0 0.0 ..., 0.0 0.0 0.0]],<br>
&gt;&gt;              mask =<br>
&gt;&gt;  [[False False False ..., False False False]<br>
&gt;&gt;  [False False False ..., False False False]<br>
&gt;&gt;  [False False False ..., False False False]<br>
&gt;&gt;  ...,<br>
&gt;&gt;  [False False False ..., False False False]<br>
&gt;&gt;  [False False False ..., False False False]<br>
&gt;&gt;  [False False False ..., False False False]],<br>
&gt;&gt;        fill_value = 1.0)<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; Was this change in functionality intentional?<br>
&gt;&gt;<br>
&gt;&gt; The NetCDF files I used are available at:<br>
&gt;&gt;<br>
&gt;&gt;     <a href="ftp://ftpprd.ncep.noaa.gov/pub/data/nccf/com/nos/prod/glofs.20151229/" rel="noreferrer" target="_blank">ftp://ftpprd.ncep.noaa.gov/pub/data/nccf/com/nos/prod/glofs.20151229/</a><br>
&gt;&gt;<br>
&gt;&gt; (directory will change based on date)<br>
&gt;&gt;<br>
&gt;&gt; Thanks,<br>
&gt;&gt; Jason<br>
&gt;&gt; --<br>
&gt;&gt; Jason Greenlaw<br>
&gt;&gt; Software Developer, ERT, Inc.<br>
&gt;&gt; NOAA/NOS/OCS/CSDL<br>
&gt;&gt; <a href="http://nowcoast.noaa.gov" rel="noreferrer" target="_blank">http://nowcoast.noaa.gov</a><br>
&gt;&gt; <a href="mailto:Jason.Greenlaw@noaa.gov">Jason.Greenlaw@noaa.gov</a><br>
&gt;&gt;<br>
&gt;<br>
&gt;<br>
</div></div>&gt; _______________________________________________<br>
&gt; pyngl-talk mailing list<br>
&gt; List instructions, subscriber options, unsubscribe:<br>
&gt; <a href="http://mailman.ucar.edu/mailman/listinfo/pyngl-talk" rel="noreferrer" target="_blank">http://mailman.ucar.edu/mailman/listinfo/pyngl-talk</a><br>
&gt;<br>
</blockquote></div><br></div></div></div>