Re: qsort

From: Dennis Shea (shea AT cgd.ucar.edu)
Date: Thu Jun 16 2005 - 11:07:38 MDT


>Just like to know if anyone has noticed any memory issues while using
>qsort. I'm sorting large arrays in a loop and deleting variables along the
>way to save memory but it seems that everytime qsort is called, temp
>variables are created and then not deleted(that's my diagnosis anyway).
>Run this test program and top. It eventually sucks up my machine memory:
>
>begin
> do i = 0,200
> print((/i/))
> x1D = new((/4000000/),integer)
> x1D = 1
> qsort(x1D)
> delete(x1D)
> end do
>end
>
>Also, I think the example on qsort is incorrect. 'qsort_x = qsort(x)' will
>not work.
>
>http://www.ncl.ucar.edu/Document/Functions/Built-in/qsort.shtml
>
Hello

[1]
yes ... the documentation is incorrect.
        qsort is a procedure not a function.
        I have fixed that. [do a reload on the above page]

It should be:
        
  x = (/4.3, 0.9, 5.2, 7.7, 2.3, -4.7, -9.1/)
  qsort(x)
  
THX for the 'heads-up'

----
[2]
I copied your code and ran the following on several of our machines.
[SGI: 64GB memory], [linux: 8GB and 2GB], [Solaris: ?1GB or 2 GB] 

%>ncl testQ.ncl Copyright (C) 1995-2004 - All Rights Reserved University Corporation for Atmospheric Research NCAR Command Language Version 4.2.0.a032 The use of this software is governed by a License Agreement. See http://ngwww.ucar.edu/ncl/ for more details. (0) 0 (0) 1 (0) 2 (0) 3 (0) 4 (0) 5 (0) 6 (0) 7 (0) 8 (0) 9 [I stopped it here]

I also tried some large vectors on a large memory machine:

/home/tempest/shea>ncl ncl 0> N = 10000000 ncl 1> x = random_uniform(-10,10,N) ncl 2> qsort(x) ncl 3> N = 50000000 ; this is *slow* but works ncl 4> y = random_uniform(-10,10,N) ncl 5> qsort(y) ncl 6> quit

Not fast but no memory error.

What OS [uname -a] and how much memory do you have available?

--- Incidently,

do i = 0,200 print((/i/)) x1D = new((/4000000/),integer) x1D = 1 qsort(x1D) delete(x1D) ; *no* need to do this here because ; the size/type does not change with ; each iteration end do

--- I suspect that the above is a sample for debug but the best way would be

x1D = new((/4000000/),integer) ; one memory allocation

do i = 0,200 print((/i/)) ; or print("i="+i) x1D = 1 ; all 1 qsort(x1D) ; obviously no need in this trivial case end do

Regards D

_______________________________________________ ncl-talk mailing list ncl-talk@ucar.edu http://mailman.ucar.edu/mailman/listinfo/ncl-talk



This archive was generated by hypermail 2b29 : Mon Jun 20 2005 - 08:43:23 MDT