anchor.diff:              use reader = new BinaryReader(File.Open(bitMapFileName, FileMode.Open, FileAccess.Read, FileShare.Read))
               let nrows = reader.ReadInt32()
               let ncols = reader.ReadInt32()
  -            let createRowBitMap i = BitMap.init ncols (fun i -> reader.ReadBoolean())
  +            let createRowBitMap i = BitMap.ofArray (readBooleansRow ncols reader)
               let map = Array.init nrows createRowBitMap
               BitMap.transform map
               cache.Add(bitMapFileName, map)
  
positive.code:     open BitMap
      let bitmapExtension = ".sbm" // sparse binary map
      let valuesExtension = ".sbv" // sparse binary values
      let writeBitMap fileName (map:bitmap []) =
          use writer = new BinaryWriter(File.Open(fileName, FileMode.OpenOrCreate))
          let nrows = map.Length
          let ncols = (fst map.[0]).Length
          writer.Write(nrows)
          writer.Write(ncols)
  
          let boolArray = Array.init ncols (fun i -> true)
          for (bitarray,_) in map do
              bitarray.CopyTo(boolArray, 0)
              boolArray |> Array.iter (fun b -> (writer.Write(b))) 
  
      let writeValues fileName (values:seq<int option>) =
          use writer = new BinaryWriter(File.Open(fileName, FileMode.OpenOrCreate))
  
negative.code:         // 28s 1000 * 100
          // 10s 100*1000
          // 9s 100*1000 with MemoryMappedFile caching
          // Sparse (all with bitmap caching up front)
          // 32s 10000 * 10
          // 18s 1000 * 100
          // 15s 100 * 1000
  
      let testGebco() =
          ignore // TODO
  
  