void Preload() { using (FileStream fs = OpenRead()) { CacheSize = (int)(fs.Length / BlockDBEntry.Size); EnsureCapacity(CacheSize); LastFlushedIndex = CacheSize; // Converting from byte[] to BlockDBEntry[] on the fly // This is possible because BlockDBEntry is a sequentially packed struct fixed(BlockDBEntry *pCacheStart = cacheStore) { fixed(byte *pBuffer = ioBuffer) { byte *pCache = (byte *)pCacheStart; while (fs.Position < fs.Length) { int bytesToRead = Math.Min(BufferSize, (int)(fs.Length - fs.Position)); int bytesInBuffer = 0; do { int bytesRead = fs.Read(ioBuffer, bytesInBuffer, BufferSize - bytesInBuffer); bytesInBuffer += bytesRead; } while(bytesInBuffer < bytesToRead); BufferUtil.MemCpy(pBuffer, pCache, bytesInBuffer); pCache += bytesInBuffer; } } } } }