anchor.diff:  
           let root = @"D:\a\data\marspec\MARSPEC_10m\ascii\"
           let paths = Directory.GetFiles(root, "*.asc")
  -        testSimpleRandom "test simple AllMarspec10m" paths 100 1000 |> ignore
  -        //testSparseRandom "test sparse AllMarspec10m" paths 10000 10 |> ignore
  -        
  +        let prm = [(10000,10);(1000,100);(100,1000)]
  +        for (outer, inner) in prm do
  +            testSimpleRandom "Simple AllMarspec10m" paths outer inner |> ignore
  +            testMemoryRandom "Memory mapped AllMarspec10m" paths outer inner |> ignore
  +            testSparseRandom "Sparse AllMarspec10m" paths outer inner |> ignore
  +            testBatchRandom "Batch AllMarspec10m" paths outer inner |> ignore
           // Simple
  -        // 39s 10000 * 10
  -        // 22s 1000 * 100
  -        // 17s 100 * 1000
  -        // 16s 100 * 1000 with BinaryReader caching
  +        // 32s 10000 * 10
  +        // 20s 1000 * 100
  +        // 14s 100 * 1000
  +        // 13s 100 * 1000 with BinaryReader caching
           // MemoryMappedRead
  -        // 86s 10000 * 10
  -        // 28s 1000 * 100
  -        // 10s 100*1000
  +        // 109s 10000 * 10
  +        // 23s 1000 * 100
  +        // 6s 100*1000
           // 9s 100*1000 with MemoryMappedFile caching
           // Sparse (all with bitmap caching up front)
           // 32s 10000 * 10
  -        // 18s 1000 * 100
  +        // 17s 1000 * 100
  +        // 14s 100 * 1000
  +        // Batch
  +        // 34s 10000 * 10
  +        // 20s 1000 * 100
           // 15s 100 * 1000
   
       let testGebco() =
  
positive.code:     
  module Reader =
      let simpleQuery indices fileName =
          //SimpleReadWrite.readValues fileName indices
          MemoryMappedSimpleRead.readValues fileName indices
  
      let sparseQuery indices fileName =
          SparseReadWrite.readValues fileName indices
  
negative.code:         for i=0 to len-1 do
              sw.Restart()
              let indices = [1..innerlen] |> List.map (fun i -> (int64 (r.Next(0, 2160*1080)) ))
              //sorted and distinct input is assumed by some readers
              let indices = List.sort indices |> Seq.distinct |> List.ofSeq
              result <- Array.map (query indices) sbgPaths
              sw.Stop()
              arr.[i] <- sw.ElapsedMilliseconds
  
          printfn "avg %f ms" (Array.averageBy float arr)
          printfn "max %d ms" (Array.max arr)
          printfn "sum %d ms" (Array.sum arr)
          result
  