![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Rodman |
|
|||
|
CIO ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 6144 Регистрация: 7.5.2006 Где: Ukraine ⇛ Kyiv ci ty Репутация: 7 Всего: 122 |
Дароф.
есть текстовый файл с данными. пример:
ТТХ: 1. в каждой строчке через запятую цифры, кроме последней 2. все цифры целые 3. таких кортежей может быть N миллионов. суть задачи: удалить повторения картежей. так вот прошу совета - как корректнее перебрать? мне приходят несколько вариантов (вечером буду пробовать): 1. открыть файл стандартными средствами и перебрать. 2. Конвертировать в типизированный - его обработать - вернуть в текстовый формат. 3. Загнать в БД - обработать - вернуть в тестовый формат. какой метод корректнее? или мож есть еще вариант? сенкс |
|||
|
||||
| Keeper89 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 20 Всего: 58 |
2 вариант я бы отбросил, а из оставшихся взял третий - загнать в базу, а потом используя SELECT DISTINCT перегнать в текстовый файл.
|
|||
|
||||
| Данкинг |
|
|||
![]() Yersinia pestis ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 8302 Регистрация: 7.11.2006 Где: მოსკოვი Репутация: 9 Всего: 130 |
Если миллионы записей, то я бы препочёл этот вариант, ибо запрос в любом случае быстрее, чем перебор. -------------------- There's nothing left but silent epitaphs. |
|||
|
||||
| Beltar |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 627 Регистрация: 11.1.2006 Репутация: 3 Всего: 7 |
А как сами БД решают такую задачу?
-------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере. |
|||
|
||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
Индексацией. Для тебя может быть простейший вариант - построить хеши хорошей функцией, список хешей отсортировать, дубли удалить... -------------------- |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
||||
|
||||
| Данкинг |
|
|||
![]() Yersinia pestis ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 8302 Регистрация: 7.11.2006 Где: მოსკოვი Репутация: 9 Всего: 130 |
Каким образом - перебирать весь стринглист? Вот если при чтении в базу проверять запись на существование с помощью locate - можно попробовать сравнить по скорости с выборкой distinct из базы. Это сообщение отредактировал(а) Данкинг - 17.11.2009, 00:13 -------------------- There's nothing left but silent epitaphs. |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
Не нужно перебирать. Есть ещё HashedStringList, который работает быстрее. Главное комп, с большим объёмом памяти. Например:
|
|||
|
||||
| Beltar |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 627 Регистрация: 11.1.2006 Репутация: 3 Всего: 7 |
2 Demo:
А сами по себе подготовительные мероприятия вроде индексации времени не отнимут? Или, например, рассчет хешей. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере. |
|||
|
||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
Конечно, на хеширование уйдёт время. Смысл в том, чтобы попытаться сократить объём сортируемых данных. -------------------- |
|||
|
||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
А в принципе - построить индекс мне кажется хорошей идеей.
Данные достаточно структурированы, индекс будет достаточно простой. А после построения индекса - уже никаких проблем с поиском одинаковых строк. -------------------- |
|||
|
||||
| Rodman |
|
|||
|
CIO ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 6144 Регистрация: 7.5.2006 Где: Ukraine ⇛ Kyiv ci ty Репутация: 7 Всего: 122 |
||||
|
||||
| THandle |
|
|||
![]() Хранитель Клуба Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 65 Всего: 372 |
Rodman, IniFiles.THashedStringList.
В принципе тот же StringList, только он хэширует имена, и поэтому они ищутся побыстрее. Хотя лично мне кажется что не для твоей задачи это дело |
|||
|
||||
| sCreator |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 20.8.2009 Где: Московская област ь Репутация: 2 Всего: 5 |
Может быть запрос и быстрее чем перебор (если еще и поле будет индексировано ). Только кроме запроса еще предстоит: - прочесть каждую строчку из файла. - оформить SQL запрос на запись. - передать через драйвер взаимодействия в БД. - там двигатель БД вытащит строчку из запроса ( препарирование немного это ускорит). - возможно конвертирует в свою кодировку - занесет в таблицу - переиндексирует - получит запрос на выборку - если поле будет не индексировано то DISTINCT, боюсь, будет производить отбор тоже перебором записей, разве что код отбора вероятнее записан более оптимально. - далее все отобранные записи будут передаваться через драйвер в приложение ( с возможной обратной конвертацией) - сохранение строчек в файл. Думаю, это будет даже медленнее ( хотя все зависит от реализации других вариантов) Если допускается перестроение строк и объем позволяет, предложил бы такой вариант.
если без перестроения то использовать не THashedStringList а непосредственно TStringHash ( в первом он используется с размерностью 256 - думаю для милионов записей надо побольше, например
Оба примера кушают много памяти и набросаны на скорую руку. |
||||||
|
|||||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |