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;
  }