Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Открытие текстовика с большим кол-вом данных, нужно перебрать кортежи 
:(
    Опции темы
Rodman
Дата 16.11.2009, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 7
Всего: 122



Дароф.

есть текстовый файл с данными.
пример:
Код

2, 5, 34, 56, 67, 78, 89
34, 45, 56, 67, 78, 80, 91
....
3, 5, 6, 7, 23, 45, 55


ТТХ:
1. в каждой строчке через запятую цифры, кроме последней
2.  все цифры целые
3. таких кортежей может быть N миллионов.

суть задачи: удалить повторения картежей.

так вот прошу совета - как корректнее перебрать?

мне приходят несколько вариантов (вечером буду пробовать):
1. открыть файл стандартными средствами и перебрать.
2. Конвертировать в типизированный - его обработать - вернуть в текстовый формат.
3. Загнать в БД - обработать - вернуть в тестовый формат.

какой метод корректнее? или мож есть еще вариант?

сенкс
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Keeper89
Дата 16.11.2009, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



2 вариант я бы отбросил, а из оставшихся взял третий - загнать в базу, а потом используя SELECT DISTINCT перегнать в текстовый файл.


--------------------
PM MAIL WWW   Вверх
Данкинг
Дата 16.11.2009, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 9
Всего: 130



Цитата(Rodman @  16.11.2009,  16:47 Найти цитируемый пост)
3. Загнать в БД - обработать - вернуть в тестовый формат.

Если миллионы записей, то я бы препочёл этот вариант, ибо запрос в любом случае быстрее, чем перебор.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Beltar
Дата 16.11.2009, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 3
Всего: 7



А как сами БД решают такую задачу?


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Демо
Дата 16.11.2009, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Цитата(Beltar @  16.11.2009,  19:34 Найти цитируемый пост)
А как сами БД решают такую задачу? 


Индексацией.

Для тебя может быть простейший вариант - построить хеши хорошей функцией, список хешей отсортировать, дубли удалить...


--------------------
    
PM MAIL ICQ Skype   Вверх
Akella
Дата 17.11.2009, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата(Rodman @  16.11.2009,  16:47 Найти цитируемый пост)
суть задачи: удалить повторения картежей.

Читать построчно в стринглист или в базу. При чтении проверять на уже существующую запись.
PM MAIL   Вверх
Данкинг
Дата 17.11.2009, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 9
Всего: 130



Цитата(Akella @  17.11.2009,  00:04 Найти цитируемый пост)
При чтении проверять на уже существующую запись. 

Каким образом - перебирать весь стринглист?
Вот если при чтении в базу проверять запись на существование с помощью locate - можно попробовать сравнить по скорости с выборкой distinct из базы.

Это сообщение отредактировал(а) Данкинг - 17.11.2009, 00:13


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Akella
Дата 17.11.2009, 07:56 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата(Данкинг @  17.11.2009,  00:12 Найти цитируемый пост)
Каким образом - перебирать весь стринглист?

Не нужно перебирать. 
Есть ещё HashedStringList, который работает быстрее. Главное комп, с большим объёмом памяти.

Например:

Код

      hsl := THashedStringList.Create;
      hsl.Sorted := true;
      if hsl.Find(Stroka, iRecIndex) then Continue;

PM MAIL   Вверх
Beltar
Дата 17.11.2009, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 3
Всего: 7



2 Demo:

А сами по себе подготовительные мероприятия вроде индексации времени не отнимут? Или, например, рассчет хешей.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Демо
Дата 17.11.2009, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Цитата(Beltar @  17.11.2009,  08:12 Найти цитируемый пост)
А сами по себе подготовительные мероприятия вроде индексации времени не отнимут? Или, например, рассчет хешей. 


Конечно, на хеширование уйдёт время.

Смысл в том, чтобы попытаться сократить объём сортируемых данных.


--------------------
    
PM MAIL ICQ Skype   Вверх
Демо
Дата 17.11.2009, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



А в принципе - построить индекс мне кажется хорошей идеей.
Данные достаточно структурированы, индекс будет достаточно простой.
А после построения индекса - уже никаких проблем с поиском одинаковых строк.


--------------------
    
PM MAIL ICQ Skype   Вверх
Rodman
Дата 28.11.2009, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 7
Всего: 122



Цитата(Akella @  17.11.2009,  07:56 Найти цитируемый пост)
HashedStringList

шо за зверюка?
PM MAIL WWW Skype GTalk YIM MSN   Вверх
THandle
Дата 30.11.2009, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 65
Всего: 372



Rodman, IniFiles.THashedStringList.

В принципе тот же StringList, только он хэширует имена, и поэтому они ищутся побыстрее. Хотя лично мне кажется что не для твоей задачи это дело smile
PM   Вверх
sCreator
Дата 30.11.2009, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 20.8.2009
Где: Московская област ь

Репутация: 2
Всего: 5



Цитата(Данкинг @ 16.11.2009,  18:55)
Цитата(Rodman @  16.11.2009,  16:47 Найти цитируемый пост)
3. Загнать в БД - обработать - вернуть в тестовый формат.

Если миллионы записей, то я бы препочёл этот вариант, ибо запрос в любом случае быстрее, чем перебор.

Может быть запрос и быстрее чем перебор (если еще и поле будет индексировано ).

Только кроме запроса еще предстоит:
- прочесть каждую строчку из файла.
- оформить SQL запрос на запись.
- передать через драйвер взаимодействия в БД.
- там двигатель БД вытащит строчку из запроса ( препарирование немного это ускорит).
- возможно конвертирует в свою кодировку
- занесет в таблицу
- переиндексирует
- получит запрос на выборку
- если поле будет не индексировано то DISTINCT, боюсь, будет производить отбор тоже перебором записей, разве что код отбора вероятнее записан более оптимально.
- далее все отобранные записи будут передаваться через драйвер в приложение ( с возможной обратной конвертацией)
- сохранение строчек в файл.

Думаю, это будет даже медленнее ( хотя все зависит от реализации других вариантов)

Если допускается перестроение строк и объем позволяет, предложил бы такой вариант.
Код

procedure TDSTestForm.SortedDelDubl(fileName: string);
var
  ss, sd : TStringList;
  i: Integer;
  last: string;
begin
  ss := TStringList.Create;
  try
    ss.LoadFromFile(fileName);
    ss.Sort;
    sd := TStringList.Create;
    try
      last := '';
      for i := 0 to ss.Count - 1 do
      begin
        if ss[i] <> last then
        begin
          last := ss[i];
          sd.Add(last);
        end;
      end;
      sd.SaveToFile(ChangeFileExt(fileName, '.new' + ExtractFileExt(fileName)));
    finally
      sd.Free;
    end;
  finally
    ss.Free;
  end;
end;


если без перестроения то использовать не THashedStringList а непосредственно TStringHash ( в первом он используется с размерностью 256 - думаю для милионов записей надо побольше, например
Код

uses
  IniFiles;
{ TDSTestForm }

procedure TDSTestForm.HashedDelDubl(fileName: string);
var
  ss, sd : TStringList;
  i: Integer;
  sh: TStringHash;
  last: string;
begin
  ss := TStringList.Create;
  try
    ss.LoadFromFile(fileName);
    sd := TStringList.Create;
    try
      sh := TStringHash.Create(256 * 1024); // это лучше подобрать, но объем памяти будет зависеть не отнего а от количества помещенных строк
      try
        for i := 0 to ss.Count - 1 do
        begin
          if sh.ValueOf(ss[i]) < 0 then
          begin
            sh.Add(ss[i],0);
            sd.Add(ss[i]);
          end;
        end;
      finally
        sh.Free;
      end;
      sd.SaveToFile(ChangeFileExt(fileName, '.new' + ExtractFileExt(fileName)));
    finally
      sd.Free;
    end;
  finally
    ss.Free;
  end;
end;

Оба примера кушают много памяти и набросаны на скорую руку.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0585 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.