anchor.diff:          let valuesPath = (Path.ChangeExtension(filenameWithoutExtension, valuesExtension))
           writeValues valuesPath values
       
  +    let cache = new Dictionary<string, bitmap []>()
  +
       let readBitMap bitMapFileName = 
  -        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 map = Array.init nrows createRowBitMap
  -        map
  -
  -    let readValue (map:bitmap []) (reader:BinaryReader)  cellIndex =
  -        match BitMap.sparseIndex map cellIndex with
  -        | Some(index) -> SimpleReadWrite.readValue reader index
  -        | None -> None
  -        
  +        if cache.ContainsKey(bitMapFileName) then 
  +            cache.[bitMapFileName] 
  +        else
  +            printfn "readBitMap %s" bitMapFileName
  +            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 map = Array.init nrows createRowBitMap
  +            cache.Add(bitMapFileName, map)
  +            map
  +
  +    let readValue (map:bitmap []) (reader:BinaryReader) cellIndex =
  +        let read sparseIndex = 
  +            reader.BaseStream.Position <- sparseIndex*4L
  +            reader.ReadInt32()
  +        BitMap.sparseIndex read map cellIndex
  +
       let readValues valuesFileName indices = 
  -        let map = readBitMap (Path.ChangeExtension(valuesFileName, bitmapExtension))
  +        let map = time "readBitMap" (fun () -> readBitMap (Path.ChangeExtension(valuesFileName, bitmapExtension)))
           use reader = new BinaryReader(File.Open(valuesFileName, FileMode.Open, FileAccess.Read, FileShare.Read))
           // Use list or array to force creation of values (otherwise reader gets disposed before the values are read)
           let values = 
  
positive.code:         testSmallMarspec()
          testAllMarspec10m()
  
  Test.runall()
negative.code: 
  module BitMap =
  
      type bitmap = System.Collections.BitArray * int // map * skipped count
      
      let ofArray (bools:bool []) = 
          let skippedCount = bools |> Seq.filter (not) |> Seq.length
          ((new System.Collections.BitArray(bools)), skippedCount):bitmap
      
      let init n (f:int->bool) = 
          let bools = Array.init n f
          ofArray bools    
  
      let isSet index (b:bitmap) =
          (fst b).Get(int index)
  
      let countUpto (uptoIndex:int64) (b:bitmap) = 
          let mutable count = 0L
          for i=0 to (int uptoIndex)-1 do
              if isSet i b then
                  count <- count+1L
          count
  
  