예제 #1
0
        /// <summary>
        /// Индексирование-кеширование одной строки
        /// </summary>
        /// <param name="lineNumber">Номер строки, которую мы добавляем в индекс-кеш</param>
        /// <param name="targetLine">Сама строка, добавляемая в индекс</param>
        /// <param name="buildCacheCancel">Токен для отмены</param>
        public void cacheLine(long lineNumber, string targetLine, CancellationTokenSource buildCacheCancel = null)
        {
            // Проходим по символам строки
            for (int i = 0; i < targetLine.Length - 1; i++)
            {
                if ((buildCacheCancel != null) && (buildCacheCancel.Token.IsCancellationRequested))
                {
                    return;
                }

                // Берем два символа (текущий и следующий)
                string onechain = targetLine.Substring(i, 2);

                // Если в словаре не существует этой пары символов - добавляем в словарь CacheGroup, содержащий список номеров строк, в которых содержится данная пара onechain символов
                if (!chains.ContainsKey(onechain))
                {
                    chains[onechain] = new CacheGroup();
                }

                // Один объект CacheGroup не может содержать бесконечное число номеров строк (существует ограничение) и в случае его заполнения, нужно сбрасывать номера в индекс-кеш
                if (chains[onechain].isFull())
                {
                    flush(onechain, chains[onechain]);
                }
                // Добавляем номер строки в соответствующий CacheGroup
                chains[onechain].AddLine(lineNumber);
            }
        }
예제 #2
0
        /// <summary>
        /// Возвращает номера строк, в которых встречается первая пара символов строки whatToFind
        /// </summary>
        /// <param name="whatToFind"></param>
        /// <returns></returns>
        public long[] getStringNumbers(string whatToFind)
        {
            string code          = string.Empty + whatToFind[0] + whatToFind[1];
            string indexFilePath = _cachePath + "\\" + _cachePathFolder + "\\" + _groupsCatalogCache + "\\" + nameToHex(code) + ".dat";

            return(CacheGroup.getStringNumbers(indexFilePath));
        }
예제 #3
0
        /// <summary>
        /// Выполняет сброс данных индекса-кеша на жёсткий диск в каталог индекса-кеша для конкретной пары символов
        /// </summary>
        /// <param name="code"></param>
        /// <param name="groupToFlush"></param>
        private void flush(string code, CacheGroup groupToFlush)
        {
            string indexFilePath = _cachePath + "\\" + _cachePathFolder + "\\" + _groupsCatalogCache + "\\" + nameToHex(code) + ".dat";

            groupToFlush.flush(indexFilePath);
        }