anchor.diff:          printfn "sum %d ms" (Array.sum arr)
           result
   
  -
       let testSmallMarspec() =
           let result = testRandomQuery "testSmallMarspec" [|@"D:\a\data\marspec\MARSPEC_10m\ascii\bathy_10m.asc"|] 10 10000 
           printfn "result: %A" result
           
  -
       let testAllBioOracle() =
           ignore // TODO
   
  -    
       let testAllMarspec10m() =
           // fetch 1000 times, 100 random values from 40 marspec layers
   
           let root = @"D:\a\data\marspec\MARSPEC_10m\ascii\"
           let paths = Directory.GetFiles(root, "*.asc")
           testRandomQuery "testAllMarspec10m" paths 100 1000 |> ignore
  -        MemoryMappedRead.clearCache()
  -        SimpleReadWrite.clearCache()
  -        // SimpleBinaryReadWrite
           // 39s 10000 * 10
           // 22s 1000 * 100
           // 17s 100 * 1000
  
positive.code:         SimpleReadWrite.writeValues outFileName (Seq.concat values)
  
      let queryBin indices fileName =
          SimpleReadWrite.readValues fileName indices
          //MemoryMappedRead.readValues fileName indices
      
      let testPrepareLoad fileName = 
          let sbg = Path.Combine(@"D:\temp\", Path.GetFileNameWithoutExtension(fileName) + ".sbg")
  
negative.code:         | v -> Some(v)
          
      let readValues fileName indices = 
          use reader = new BinaryReader(File.Open(fileName, 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 = List.map (readValue reader) (List.ofSeq indices)
          values
  
  module MemoryMappedRead =
      open System.IO.MemoryMappedFiles
  
      let readValue (reader:MemoryMappedViewAccessor) offset cellIndex =
          let position = (cellIndex*4L) - offset
  