1/** \file
2This program benchmarks creating a netCDF file with many objects.
3
4Copyright 2010, UCAR/Unidata See COPYRIGHT file for copying and
5redistribution conditions.
6*/
7
8#include <config.h>
9#include <nc_tests.h>
10#include "err_macros.h"
11#include <netcdf.h>
12#include <stdio.h>
13#include <stdlib.h>
14#include <time.h>
15#include <sys/time.h> /* Extra high precision time info. */
16
17/* We will create this file. */
18#define FILE_NAME "bm_many_objs.nc"
19
20int main(int argc, char **argv)
21{
22    struct timeval start_timeend_timediff_time;
23    double sec;
24    int nitem = 10000; /* default number of objects of each type */
25    int i;
26    int ncid;
27    int data[] = {42};
28    int ggrpnumgrp;
29    char gname[16];
30    int vvarnumvarvnvleftnvars;
31
32    if(argc > 2) {  /* Usage */
33 printf("NetCDF performance test, writing many groups and variables.\n");
34 printf("Usage:\t%s [N]\n", argv[0]);
35 printf("\tN: number of objects\n");
36 return(0);
37    }
38    for(i = 1; i < argci++) {
39 nitem = atoi(argv[i]);
40    }
41
42    /*  create new file */
43    if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
44    if (gettimeofday(&start_timeNULL))
45 ERR;
46    /* create N groups, printing time after every 1000 */
47    numgrp = nitem;
48    for(g = 1; g < numgrp + 1; g++) {
49 sprintf(gname, "group%d", g);
50 if (nc_def_grp(ncidgname, &grp)) ERR;
51 if (nc_def_var(grp, "var", NC_INT, 0, NULL, &var)) ERR;
52 if(nc_enddef (grp)) ERR;
53 if(nc_put_var(grpvardata)) ERR;
54 if(g%1000 == 0) { /* only print every 1000th group name */
55     if (gettimeofday(&end_timeNULL)) ERR;
56     if (nc4_timeval_subtract(&diff_time, &end_time, &start_time)) ERR;
57     sec = diff_time.tv_sec + 1.0e-6 * diff_time.tv_usec;
58     printf("%s\t%.3g sec\n", gnamesec);
59 }
60    }
61    nc_close(ncid);
62
63    /*  create new file */
64    if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
65    /* create N variables, printing time after every 1000.
66     * Put NC_MAX_VARS variables per group (even though netcdf4 non-classic
67     * format does not limit variable count), create the necessary number
68     * of groups to hold nitem variables. */
69    numvar = nitem;
70    v = 1;
71    numgrp = (numvar - 1) / NC_MAX_VARS + 1;
72    vleft = numvar - (NC_MAX_VARS * (numgrp - 1));
73    if (gettimeofday(&start_timeNULL))
74 ERR;
75
76    for(g = 1; g < numgrp + 1; g++) {
77 sprintf(gname, "group%d", g);
78 if (nc_def_grp(ncidgname, &grp)) ERR;
79 nvars = g < numgrp ? NC_MAX_VARS : vleft; /* leftovers on last time through */
80 for(vn = 1; vn < nvars + 1; vn++) {
81     int var;
82     char vname[20];
83     sprintf(vname, "variable%d", v);
84     if(nc_def_var(grpvnameNC_INT, 0, NULL, &var)) ERR;
85     if(nc_put_var(grpvardata)) ERR;
86     if(v%1000 == 0) { /* only print every 1000th variable name */
87 if (gettimeofday(&end_timeNULL)) ERR;
88 if (nc4_timeval_subtract(&diff_time, &end_time, &start_time)) ERR;
89 sec = diff_time.tv_sec + 1.0e-6 * diff_time.tv_usec;
90 printf("%s/%s\t%.3g sec\n", gnamevnamesec);
91     }
92     v++;
93 }
94    }
95    nc_close(ncid);
96    return(0);
97}


HyperKWIC - Version 7.20DA executed at 11:37 on 27 Oct 2017 | Polyhedron Solutions - INTERNAL USE | COMMERCIAL (Any O/S) SN 4AKIed