![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поиск записей (строк,значений) в файловой базе.
Arsenija © (2006-11-29 11:19:00)Ребята нужен совет по работе с файлами.
Задача:
Имеется "исходный" текстовый файл вида:
произвольный заголовок
12345 1234567890 123 1234 12345678
...
...
54321 0234567891 321 4321 99999999
(около 10тыс записей)
имеется некая база из таких файлов. Нужно в этой базе найти повторы (к примеру значения второго столбца).
Реализация:
Моя прога берет исходный файл, формирует массив значений, которые ищем. Далее ищет в выбранном каталоге файлы с нужным расширением открывает их (Assignfile(), Reset(), Readln(,), Closefile()) И начинает построчно обрабатывать. При этом используется либо функция POS(подстрока из массива, считанная из файла строка)-вариант1, либо ищется вторая запись отделенная пробелами и проверяется длина записи-вариант2.
Вывод:
Не устраивает время работы-долго.При реализации варианта2 - 300файлов(200мегов) обрабатывает около 13 минут. Вариант 1 - вообще тупит по черному. Аналогичная функция поиска в TotalComander работает на порядок быстрее.
Внимание вопрос:
Какие есть варианты ускорения поиска?
novill (2006-12-05 15:14:00) [1]мысль в использовании стандартных программ, которые специально заточены под это.
grep - известная консольная прогамма для поиска подстрок и регулярных выражений в файлах и других потоках.
если интересно обработать самому:
1. Закачиваешь весь файл в буфер. например, через file stream (с StringList не связываешься, он много лишнего делает)
2. Простым POS ищешь вхождение.
3. Если подстроку нашел, смотришь где она относительно ближайших пробелов и #13#10 находится.
Arsenija (2006-12-05 15:00:00) [2]
> novill © (05.12.06 14:51) [37]
> А почему не воспользоваться консольными командами find или
> grep?
Поясни пожалуйста свою мысль.
З.Ы. Что за команда такая grep ?
novill (2006-12-05 14:51:00) [3]А почему не воспользоваться консольными командами find или grep?
Arsenija (2006-12-05 14:33:00) [4]
> Сергей М. © (01.12.06 10:12) [27]
> Грузи файл целиком в StringList и работай с уже готовым
> списком строк
Попробовал.
Ввел один StringList куда поочереди целиком записывал файлы из базы c помощью TempList.LoadFromFile(name) (вместо построчного считывания командой readln).
Результат по сравнению с [5] немного улучшился с 13 мин до 11 мин. Наверное, это предел.
Arsenija (2006-12-04 12:15:00) [5]Получается так. Есть вероятность, что дадут формат существующей базы даных (упоминал в [31] ). Пока, как говорится: чем богаты, тому и рады.
Скажу более: на текущий момент при дублировании (повторе) значения, существующая система выдает значение ( одно, первое повторяющееся). Оно (значение, которое уже повторялось) ручками-поиском (проводник или TotalComander)ищется в папке c файлами. Получаем имя файла дата и далее уже разборки на другом уровне.
Как правило, повторы затрагивают один-три файла базы. Но теоретически возможен случай, когда каждая запись (элемент массива - как удобнее) входного файла (примерно 10тыс) имела повторы в разных файлах. Получается что ручками надо искать 10 тыс раз (и найдем 10 тыс файлов).
Андрей Сенченко (2006-12-04 12:14:00) [6]Anatoly Podgoretsky © (04.12.06 12:10) [33]
он ответил.
Arsenija © (29.11.06 12:37) [5]
1- Смещение второго поля не фиксированное (поэтому ищутся разделители(пробелы)
Anatoly Podgoretsky (2006-12-04 12:10:00) [7]> Arsenija (04.12.2006 11:52:31) [31]
> Надо проверить второй столбец на предмет повтора в уже существующем списке файлов.
Что такое второй столбец, дай четкое определение.
Данный вопрос тебе уже задавался.
Сергей М. (2006-12-04 11:59:00) [8]
> Надо проверить второй столбец на предмет повтора в уже существующем
> списке файлов
Это что же получается ? Всякий раз при проверке нового файла ты будешь лезть в старые (уже проверенные ранее) файлы ?!
Arsenija (2006-12-04 11:52:00) [9]
> Прочитал 3 раза. Так и не понял ЧТО же надо сделать, что
> это за таинственный "массив значений", каким обьразом выбирается
> каталог и что в нем, и что такое "нужные расширения".
1- Приходит файл. Там несколько столбцов значений. Надо проверить второй столбец на предмет повтора в уже существующем списке файлов.
2- Интересующий столбец записываем в массив (для упрощения назвал его "массив значений"). Каждый элемент этого массива и обрабатываем на предмет дублирования.
3- Каталог выбирается ручками (зачем обрабатывать весь винчестер, если можно искать повторы в в конкретной папке (каталоге), в которой и находится файловая база. Кроме интересующих нас файлов там находятся и другой "мусор". Поэтому фильтруем файлы по расширению (обрабатываем файлы с нужным нам расширением)
> Однако сдается мне, что все это надо завернуть в БД
6 - создавать собственную базу этих номеров (записей) и постоянно ее обновлять - это изменение технологии обработки данных - неприемлимо (есть еще несколько причин). Поэтому нужно опираться на существующую файловую базу.
Одна из причин - такая база существует, но ее структура неизвестна. Даные по ней отсутствуют. Работа с ней достаточно геморное дело (несколько операций и все). Введение дублирующей базы неприемлимо с точки зрения минимизации обработки даных. (Руководство против.)
Доступными остаются только файлы (файловая база)
> Сергей М. © (01.12.06 10:12) [27]
> Грузи файл целиком в StringList и работай с уже готовым
> списком строк
Спасибо, попробую, о результатах отпишусь.
Сергей М. (2006-12-01 10:37:00) [10]И если телепатор таки не ошибся, то пара-тройка стринг-листов идеально подойдут для решения этой задачи
Сергей М. (2006-12-01 10:35:00) [11]
> MsGuns © (01.12.06 10:26) [28]
Я тоже не въехал, с какой луны тут свалился массив.
Мой кривой телепатор подсказывает, что за всем этим словоблудием скрыта след.задача : имея некий список файлов отобрать из них только те, у которых в упомянутой 2-й колонке имеются повторяющиеся ц/ч значения, т.е. значения в интересующей колонке не уникальны
MsGuns (2006-12-01 10:26:00) [12]Пример в сабже очень мне напомнил информацию об акционерах (списки акционеров) в конце года, по которому надо делать рассылку.
> прога берет исходный файл, формирует массив значений, которые ищем. Далее ищет в выбранном каталоге файлы с нужным расширением открывает их (Assignfile(), Reset(), Readln(,), Closefile()) И начинает построчно обрабатывать.
Прочитал 3 раза. Так и не понял ЧТО же надо сделать, что это за таинственный "массив значений", каким обьразом выбирается каталог и что в нем, и что такое "нужные расширения".
Однако сдается мне, что все это надо завернуть в БД
Сергей М. (2006-12-01 10:12:00) [13]Грузи файл целиком в StringList и работай с уже готовым списком строк
Arsenija (2006-12-01 09:04:00) [14]Нет никаких вариантов?
Anatoly Podgoretsky (2006-11-29 15:59:00) [15]> Arsenija (29.11.2006 15:29:21) [21]
> Решение-то какое?
Размер строки к поиску отношения не имеет.
Arsenija (2006-11-29 15:44:00) [16]
> Зачем считывать построчно.
Если целиком, то как внутри поиск проводить?
Так средниц размер и есть 500к
Jeer (2006-11-29 15:40:00) [17]
> Arsenija © (29.11.06 15:29) [21]
>
>
255*10000 = 2.55 Мбайт
Копейки.
Зачем считывать построчно.
Arsenija (2006-11-29 15:30:00) [18]
> "Пацанщину" в программинге - туда же.
> Не обижайся, увидев себя в "Прочее".
Если нет ничего конструктивного, то лирику в сторону - без обид.
Arsenija (2006-11-29 15:29:00) [19]
> Это значит, что есть строки и более 8 кб по размеру, что
> тут не понятно русским языком.
> А ты утверждаешь, что строки свыше 255 байт не бывают.
Может и быват, может и до 2гб бывают. Суть в том, что зашел разговор про размер (в каком то посте). Ок. Добавляем условие длина строки не больше 255 символов (255 байт). Решение-то какое?
Сергей М. (2006-11-29 15:18:00) [20]
> Лирику в сторону
"Пацанщину" в программинге - туда же.
Не обижайся, увидев себя в "Прочее".