Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Скорость работы с БД


Автор: Алкоголик 20.3.2014, 02:17
Есть текстовый файл(150мб)  в нем надо удалить одинаковые вопросы. Сделал так. Выделяем вопрос, проверяем есть ли в он БД, если нет то записываем в БД. БД Access работаю с ней через ADO, но на обработку файла уходит где-то 15 минут, надо сократить до 5 минут, есть какие-нибудь предложения?

Автор: kami 20.3.2014, 11:17
Варианты:
1. Отказаться от БД и использовать (к примеру) TDictionary или TStringList с dupIgnore ? (будет гораздо быстрее)
2. Ввести в БД уникальный ключ по полю "вопрос" и не проверять, а просто записывать, отлавливая исключения, возникающие на дубликатах?

Автор: Алкоголик 20.3.2014, 11:37
2 вариант и использую.

А по первому, программу будут использовать на ноутбуке(его ТТХ не знаю), но судя потому что на моем компе программа отрабатывает за 5 минут, а на их за 15, то машинка быстродействием не отличается. Поэтому боюсь если 150Мб грузить в память, то это тоже ничем хорошим не закончится.

Прочитал тут про DAO, но не смог найти примеров.

Автор: kami 20.3.2014, 14:35
Цитата(Алкоголик @  20.3.2014,  11:37 Найти цитируемый пост)
если 150Мб грузить в память, то это тоже ничем хорошим не закончится.

Почему? Приложению доступно как минимум 1,5 гектара под свои нужды, вне зависимости от того, сколько оперативки на компьютере.

Цитата(Алкоголик @  20.3.2014,  11:37 Найти цитируемый пост)
2 вариант и использую.

Как? Код в студию, пожалуйста.

Добавлено через 2 минуты и 12 секунд
Цитата(Алкоголик @  20.3.2014,  11:37 Найти цитируемый пост)
2 вариант и использую.
 У меня закрались сомнения по поводу использования именно второго предложенного варианта ввиду фразы 
Цитата(Алкоголик @  20.3.2014,  02:17 Найти цитируемый пост)
проверяем есть ли в он БД

Проверку лучше отдать на откуп самой БД.

Автор: Алкоголик 20.3.2014, 15:59
Код

              try
                Query1.Active:=False;
                Query1.SQL.Clear;
                Query1.SQL.Add('insert into tabl(str) VALUES ('+#39+st1+#39+')');
                Query1.ExecSQL;
                writeln(fnew,st2);
                flag:=false;
                i:=0;
              except
                flag2:=true;
                //showmessage('sdfsd');
              end;


А фраза да, я намеренно исказил. Считал, что так делать не правильно и было стыдно говорить, но так оказалось быстрее, чем если проверять сначала.

Сделал с striglist. Спасибо за совет.

Автор: kami 21.3.2014, 08:11
А какие-нибудь сравнительные характеристики можно опубликовать?
С Access мы знаем, что код отрабатывает за 5 минут (а на каком-то ноутбуке - за 15)
А как обстоят дела с тем же самым файлом, но на TStringList?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)