BTDB.ChunkCache.DiskChunkCache.PreserveJustMostOftenUsed C# (CSharp) Метод

PreserveJustMostOftenUsed() приватный Метод

private PreserveJustMostOftenUsed ( uint fileId ) : void
fileId uint
Результат void
        void PreserveJustMostOftenUsed(uint fileId)
        {
            var freqencies = new List<uint>();
            foreach (var itemPair in _cache)
            {
                if (itemPair.Value.FileId == fileId)
                {
                    freqencies.Add(itemPair.Value.AccessRate);
                }
            }
            var preserveRate = freqencies.OrderByDescending(r => r).Skip(freqencies.Count / 5).FirstOrDefault();
            foreach (var itemPair in _cache)
            {
                if (itemPair.Value.FileId == fileId)
                {
                    if (preserveRate < itemPair.Value.AccessRate)
                    {
                        var cacheValue = itemPair.Value;
                        var content = new byte[cacheValue.ContentLength];
                        _fileCollection.GetFile(cacheValue.FileId).RandomRead(content, 0, (int)cacheValue.ContentLength,
                                                                              cacheValue.FileOfs, true);
                        var writer = _cacheValueWriter;
                        if (writer == null)
                        {
                            goto remove;
                        }
                        lock (writer)
                        {
                            if (writer != _cacheValueWriter)
                            {
                                goto remove;
                            }
                            if (writer.GetCurrentPosition() + cacheValue.ContentLength > _sizeLimitOfOneValueFile)
                            {
                                goto remove;
                            }
                            cacheValue.FileId = _cacheValueFileId;
                            cacheValue.FileOfs = (uint)_cacheValueWriter.GetCurrentPosition();
                            _cacheValueWriter.WriteBlock(content);
                        }
                        _cache.TryUpdate(itemPair.Key, cacheValue, itemPair.Value);
                        continue;
                    }
                remove:
                    _cache.TryRemove(itemPair.Key);
                }
            }
        }