![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Быстрый вывод в текстовый файл?
Razrab © (2007-12-10 11:53:00)Добрый день, коллеги!
Подскажите способ быстрого, непострочного вывода информации в текстовый файл, если таковой вообще возможен в Delphi. Столкнулся со следующей проблемой: вывожу при помощи стандартного построчного вывода в цикле через Writeln() данные из Oracle в текстовый файл. И все бы ничего, но в одном текстовом файле количество строк 300 с лишним тысяч. В результате, создание такого файла у пользователя занимает 1 час с копейками, многовато. Каким образом можно было бы создать текстовый файл не построчно, а одним махом туда запихнуть данные из Select-а?
Заранее благодарю за помощь.
Razrab (2007-12-10 15:11:00) [41]Сергей М.
А что цикл while not ADOQuery.Eof do и обращение к полю по индексу будут быстрее?! %) Или я не так понял Ваш намек?
Palladin (2007-12-10 15:09:00) [42]надеюсь никакой контрол у тебя к нему не привязан :)
Palladin (2007-12-10 15:07:00) [43]ADOqr.Active := True;
ADOqr.First; // на кой? думаешь курсор после открытия на последней стоит?
for i := 0 to ADOqr.RecordCount - 1 do // зачем? однопроходный ведь
begin
WriteLn(F, ADOqr.FieldByName('LINE').AsString); // лучше по индексу
ADOqr.Next;
end;
ADOqr.Active := False;
пробуй это
ADOqr.CursorLocation:=clUseServer;
ADOqr.CursorType:=ctOpenForwardOnly;
ADOqr.LockType:=ltReadOnly;
ADOqr.Open;
While Not ADOqr.Eof Do
Begin
WriteLn(f,ADOqr.Fields[индекс].AsString);
ADOqr.Next;
End;
ADOqr.Close;
Сергей М. (2007-12-10 15:03:00) [44]
> Razrab © (10.12.07 14:49) [9]
> ADOqr.RecordCount
Здесь засада №1
> FieldByName
Здесь №2
Razrab (2007-12-10 15:02:00) [45]А что если данные из базы сначала в массив загонять, а уже после из него построчно писать в файл? Есть еще варианты?
palva (2007-12-10 14:57:00) [46]> Но как в данном случае еще можно реализовать, ума не приложу?
В ADO есть метод Save позволяющий сохранить весь рекордсет в виде XML-файла. Не знаю, будет ли это быстрее. Да еще и обработка этого файла понадобится.
Razrab (2007-12-10 14:49:00) [47]Вот процедура по которой формируется текстовый файл:
procedure outfiles(var F: TextFile; ADOqr: TADOQuery);
var i: integer;
begin
ADOqr.Active := True;
ADOqr.First;
for i := 0 to ADOqr.RecordCount - 1 do
begin
WriteLn(F, ADOqr.FieldByName('LINE').AsString);
ADOqr.Next;
end;
ADOqr.Active := False;
end;
Коннект через ADO. Похоже что тормоза возникают не из-за построчной записи, а из-за построчной проходки запроса. Но как в данном случае еще можно реализовать, ума не приложу?
DiamondShark (2007-12-10 12:57:00) [48]Тормоза точно не из-за метода доступа к файлу.
Скорее, из-за метода построения строки для записи в файл.
Но это гадание на кофейной гуще. Показывай код.
palva (2007-12-10 12:52:00) [49]Если выводить файл блоками, скажем по 10 кб, то это будет существенно быстрее, чем строками по 80 байт. Сделать это несложно, и вам здесь подскажут, как. Советую, однако, сначала выяснить причину тормозов.
DrPass (2007-12-10 12:51:00) [50]Кстати, даже проверил - секунд 20, и при этом еще и с ProcessMessages
procedure TForm1.Button1Click(Sender: TObject);
var
f: Textfile;
i: integer;
begin
AssignFile(f, 'c:\txt.txt');
Rewrite(f);
for i := 1 to 300000 do
begin
writeln(f, 'Съешь ещё этих мягких французских булочек да выпей чаю!');
Button1.Caption:= IntToStr(i);
end;
CloseFile(f);
end;
DrPass (2007-12-10 12:44:00) [51]
> Это sql-файл набора Insert-ov из таблицы - всего более 300.
> 000 Insert-ov.
А не слишком ли нездоровый способ? Может, стоит выполнить bulk load? Наверняка ж он и в Оракле есть.
Тем более что 1 час на выгрузку 300000 строк - это скорее в основном не из-за сохранения в файл, а из-за выгрузки данных из БД.
clickmaker (2007-12-10 12:30:00) [52]
> [2] Razrab © (10.12.07 12:05)
> Это sql-файл набора Insert-ov из таблицы - всего более 300.000
> Insert-ov
а импорта-экспорта в Оракле нету? Типа bcp в MS SQL
Сергей М. (2007-12-10 12:13:00) [53]Показывай в коде, как формируешь файл ..
Razrab (2007-12-10 12:05:00) [54]Это sql-файл набора Insert-ov из таблицы - всего более 300.000 Insert-ov. У клиента нет доступа к нашей БД, и он грузит к себе данные просто запуская набор подобных sql-файлов, которые получает по e-mail.
Сергей М. (2007-12-10 11:58:00) [55]А можно полюбопытствовать, зачем клиенту понадобился такой файл ?