Ejemplo n.º 1
0
        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;
        }
Ejemplo n.º 2
0
 private TKey GetKey(MemoryAccessor ma, long index)
 {
     return(ma.Get <TKey>(GetAbsoluteOffset(index) + keyOffset));
 }