[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: netCDF Java API question



----- Original Message -----
From: "John C Cartwright" <address@hidden>
To: <address@hidden>
Sent: Wednesday, April 17, 2002 9:19 AM
Subject: netCDF Java API question


> Hello John,
>
> I have a question about the Java API that I was hoping that you could
> help me with.
>
> I'm trying to create a simple "stack" of 2D grids using the code listed
> below.  The problem is that I'm running out of memory and I assume that
> there must be something I'm doing wrong since it seems unlikely that the
> size of the output file would be constrained by the available RAM.  The
> code seems to work OK if I reduce the number of rows and columns.
>
> Can you show me what I'm doing wrong or direct me to a better
> forum/source of information on this?
>
> Thanks!
>
> -- john

Hi John:

Your problem is in allocating the Variable Array all at once, which is an
in-memory array. You really want to allocate only a 2D slice, and write the
slices out sequentially. below is one way to do that.

BTW, in testing this, I discovered an embarrrassing performance bug that
makes things run (blush) 40 time slower in some cases, for example yours! I
just fixed that, and a new release 2.06 is available at

http://www.unidata.ucar.edu/packages/netcdf-java/

you will definitely want to use it!

Also, posting questions to address@hidden lets everyone on
that list see your questions, and possibly learn, if you dont mind exposing
you mistakes. With your permission, I would like to repost this answer
there.


     /* old way - uses too much memory
     int val=0;
     ArrayInt gviA = new ArrayInt.D3(daysSince1900.length,
latDim.getLength(), lonDim.getLength());
     Index ima = gviA.getIndex();
     // write
     for (i=0; i<daysSince1900.length; i++) {
       for (j=0; j<latDim.getLength(); j++) {
         for (k=0; k<lonDim.getLength(); k++) {
            // gviA.setInt(ima.set(i,j,k), gviData[i][j][k]);
            gviA.setInt(ima.set(i,j,k), val);  // write dummy data for
testing
         }
       }
       val++;
     }
     // write gviData out to disk
     try {
       ncfile.write("gvi", gviA);
     } catch (IOException e) {
       System.err.println("ERROR writing file");
     }

     */

     // new way, write one 2D slice at a time
     int[] origin = new int[3];
     int val=0;
     ArrayInt gviA = new ArrayInt.D3(1, latDim.getLength(),
lonDim.getLength());
     Index ima = gviA.getIndex();

     for (i=0; i<daysSince1900.length; i++) {
      origin[0] = i;  // which slice am i writing ?

       for (j=0; j<latDim.getLength(); j++) {
         for (k=0; k<lonDim.getLength(); k++) {
            gviA.setInt(ima.set(0,j,k), val);  // write dummy data for
testing
         }
       }

        // write gviData out to disk
       try {
         ncfile.write("gvi", origin, gviA);
       } catch (IOException e) {
         System.err.println("ERROR writing file");
       }

       val++;
     }