private int populateFile2( NetcdfFileWriteable ncFile, String varName, DataType dataType, int[] dimensions, int valueCounter, Random generator) throws IOException, InvalidRangeException { long singleWriteSize = maxMemory / dataType.getSize(); int highestNonWriteDim = determineHighestNonWriteDimension(dimensions, singleWriteSize); int[] singleStep = createWriteStep(dimensions, singleWriteSize, highestNonWriteDim); int numStepWrites = determineNumberOfStepWrites(singleStep, singleWriteSize); System.out.println( "SingleWriteSize: " + singleWriteSize + " datatype size: " + dataType.getSize() + " singleStep: " + arrayToString(singleStep) + " numberStepsPerWrite: " + numStepWrites); int[] allOnes = new int[dimensions.length]; int[] allZeros = new int[dimensions.length]; for (int i = 0; i < allOnes.length; i++) { allOnes[i] = 1; allZeros[i] = 0; } Index origin = new Index(dimensions, allOnes); long totalSize = origin.getSize(); long writtenSoFar = 0; boolean done = false; while (!done) { for (int i = 0; i < numStepWrites; i++) { // this is a crack at an optimization if ((highestNonWriteDim >= 0) && ((origin.getCurrentCounter()[highestNonWriteDim] + numStepWrites) <= dimensions[highestNonWriteDim])) { singleStep[highestNonWriteDim] = numStepWrites; System.out.println("JUST OPTIMIZED. New write step: " + arrayToString(singleStep)); // keep 'i' right i += numStepWrites - 1; } else { singleStep[highestNonWriteDim] = 1; } Array array = new ArrayInt(singleStep); IndexIterator iter = array.getIndexIterator(); while (iter.hasNext()) { iter.getIntNext(); // uncomment the following line for a random distribution // iter.setIntCurrent((int) (Math.abs(generator.nextGaussian()) * 40) ); // uncomment this line for an incrementing value iter.setIntCurrent(valueCounter); valueCounter++; // book keeping writtenSoFar++; // origin.incr(); } System.out.println( "Writing to file: " + ncFile.getLocation() + ". var_name: " + varName + " origin: " + arrayToString(origin.getCurrentCounter()) + " writeSize: " + array.getSize() + " write shape: " + arrayToString(singleStep)); // write to the actual file ncFile.write(varName, origin.getCurrentCounter(), array); // update origin accordingly for (int j = 0; j < Index.computeSize(singleStep); j++) { // writtenSoFar++; origin.incr(); } System.out.println( "\tcurrentIndex: " + arrayToString(origin.getCurrentCounter()) + " currentElement: " + origin.currentElement() + " totalsize: " + (totalSize) + " writtenSoFar: " + writtenSoFar); if (writtenSoFar >= totalSize) { done = true; break; } } } return valueCounter; }