private void StartSort(long ps) { logger.LogInfo("Copying temp file..."); File.Copy(path, path + ".tmp"); logger.LogInfo("Resize temp file..."); var newFilesSize = (long)index.Count * valueSize + offset; logger.LogInfo($"New file size: {newFilesSize}"); using (var f = File.Open(path + ".tmp", FileMode.OpenOrCreate, FileAccess.ReadWrite)) f.SetLength(newFilesSize); logger.LogInfo("Sorting..."); var tmpAccessor = new MemoryAccessor(path + ".tmp", 0, ps); var sortedIndex = new SortedDictionary <TKey, long>(index); var newIndex = new Dictionary <TKey, long>(); var off = offset; foreach (var kv in sortedIndex) { Unsafe.Write(tmpAccessor.GetPtr(off), accessor.Get <T>(kv.Value)); newIndex.Add(kv.Key, off); off += valueSize; } accessor.Dispose(); tmpAccessor.Dispose(); logger.LogInfo("Replace files..."); File.Delete(path); File.Move(path + ".tmp", path); logger.LogInfo("Reload database..."); accessor = new MemoryAccessor(path, 0, pageSize); fileSize = new FileInfo(path).Length; index = newIndex; }
private TKey GetKey(MemoryAccessor ma, long index) { return(ma.Get <TKey>(GetAbsoluteOffset(index) + keyOffset)); }