/// <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); } }
/// <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)); }
/// <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); }