Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.02.2013, 00:19   #1
Jleksern
Форумчанин
 
Аватар для Jleksern
 
Регистрация: 14.10.2011
Сообщений: 137
По умолчанию Ускорение работы цикла

Каким образом можно повысить работу данного скрипта?

Код:
for i := 0 to Mmo1.Lines.Count-1 do
    mmo3.Lines.Add('INSERT INTO '+cbb1.Text+' (name, password) VALUES ('''+
      mmo1.Lines[I]+''','''+ mmo2.Lines[I]+''');');
Примерно предполагаю что нужно использовать TStringList, но как его адаптировать Я не знаю.

Дело в том что скрипт работает медленно, на то чтоб он объединил миллион строк с мемо1,мемо2 в мемо3 уйдет очень много время.
Jleksern вне форума Ответить с цитированием
Старый 10.02.2013, 00:41   #2
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

а в чем суть данного обьединения ?
создать INSERT - скрипт на миллион строк ? О_о
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 10.02.2013, 01:11   #3
Jleksern
Форумчанин
 
Аватар для Jleksern
 
Регистрация: 14.10.2011
Сообщений: 137
По умолчанию

Суть в том что у меня есть 2 текстовика в которых простые слова.
В каждом документе по миллиону строк, в строке одно слово.
Мы объединяем строки, первую строку из первого мемо объединяем с первой строкой второго мемо.
Дальше добавляем операторы чтоб потом загнать в Базу Данных.

Примерно получается так.
Мемо1 Мемо2
Строка1 Строка11
Строка2 Строка22
Строка3 Строка33

Мемо3
INSERT INTO users (name, password) VALUES ('Строка1','Строка11');
INSERT INTO users (name, password) VALUES ('Строка2','Строка22');
INSERT INTO users (name, password) VALUES ('Строка3','Строка33');

Объединением строк занимается код с моего первого поста.

Вот только проблема чтоб усовершенствовать код ибо очень долго объединяет таким образом.
Jleksern вне форума Ответить с цитированием
Старый 10.02.2013, 02:21   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Попробуйте:
Код:
mmo3.Lines.BeginUpdate;
for i := 0 to Mmo1.Lines.Count-1 do
    mmo3.Lines.Add('INSERT INTO '+cbb1.Text+' (name, password) VALUES ('''+
      mmo1.Lines[I]+''','''+ mmo2.Lines[I]+''');');
mmo3.Lines.EndUpdate;
Это топорный вариант. Лучше придумать что-нибудь более красивое (не насчет объединения строк, а насчет вставки в базу - может есть возможность вставлять сразу несколько данных, а не одно).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 10.02.2013, 07:28   #5
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

псевдокод
Код:
Comand.CommandText:='INSERT INTO '+cbb1.Text+' (name, password) VALUES (:name , :password);';
Comand.Prepared:=true;
for i := 0 to Mmo1.Lines.Count-1 do
begin
Comand.parameters[0]:=mmo1.Lines[I];
Comand.parameters[1]:=mmo2.Lines[I];
Comand.Execute;
end;
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 10.02.2013, 09:17   #6
Jleksern
Форумчанин
 
Аватар для Jleksern
 
Регистрация: 14.10.2011
Сообщений: 137
По умолчанию

Благодарю Вас за ответы.

Цитата:
Сообщение от BDA Посмотреть сообщение
Попробуйте:
Код:
mmo3.Lines.BeginUpdate;
for i := 0 to Mmo1.Lines.Count-1 do
    mmo3.Lines.Add('INSERT INTO '+cbb1.Text+' (name, password) VALUES ('''+
      mmo1.Lines[I]+''','''+ mmo2.Lines[I]+''');');
mmo3.Lines.EndUpdate;
Это топорный вариант. Лучше придумать что-нибудь более красивое (не насчет объединения строк, а насчет вставки в базу - может есть возможность вставлять сразу несколько данных, а не одно).
Дело в том что все данные сбегаются с разных источников, могут быть уже с готовым запросом либо ещё в другом формате к примеру в виде мыла.
И чтоб не было дубликатов нужно всё привести к одному целому по которому можно будет найти дубликаты строк.
Я решил именно таким способом.
Потому что чтоб провести проверку на дубликаты понадобиться ещё дампнуть БД, в базе данных оно будет именно в таком варианте.
Jleksern вне форума Ответить с цитированием
Старый 10.02.2013, 11:40   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

возьмите вместо TMemo (который визуальный) невизуальный TStringList
думаю, что Вы будете удивлены приростом скорости!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.02.2013, 13:10   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

StringList будет быстрей без вариантов. Но можно и другим путем пойти. Вот, например, провайдер JET OLEDB поддерживает запросы из текстовых файлов с разделителями. И если ваша СУБД может обращаться к другим источникам данных, то создать один текстовый файл с уже сформированными строками и одной командой INSERT загнать все в базу. Удивлению не будет границ
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 10.02.2013 в 13:12.
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ускорение программы С++ rUs_LAN Помощь студентам 4 16.08.2012 13:57
алгоритмы нахождения эйлерова цикла и гамильтонова цикла в графе. Necare Помощь студентам 0 15.11.2011 18:26
Как в C# прервать работу цикла при нажатии клавиши xata1988 Общие вопросы .NET 5 14.02.2011 14:48
ускорение виндовс voland123454321 Windows 22 04.09.2010 12:16
Переход от цикла к циклу не выходя из цикла (без multithreading) Qousio Общие вопросы C/C++ 2 16.05.2009 09:27