Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Быстрый вывод в текстовый файл?


Страницы:   1 2 3

Razrab ©   (2007-12-10 11:53:00) 

Добрый день, коллеги!
Подскажите способ быстрого, непострочного вывода информации в текстовый файл, если таковой вообще возможен в Delphi. Столкнулся со следующей проблемой: вывожу при помощи стандартного построчного вывода в цикле через Writeln() данные из Oracle в текстовый файл. И все бы ничего, но в одном текстовом файле количество строк 300 с лишним тысяч. В результате, создание такого файла у пользователя занимает 1 час с копейками, многовато. Каким образом можно было бы создать текстовый файл не построчно, а одним махом туда запихнуть данные из Select-а?
Заранее благодарю за помощь.


DrPass   (2007-12-10 16:51:00) [21]


> ADOQuery и ADODataSet на MSSQL и Jet, абсолютно равны по
> производительности

Логично, т.к. первый класс от второго отличается только тем, что CommandText выведен в свойство SQL, в остальном они тождественны


Palladin   (2007-12-10 16:08:00) [22]


> sniknik ©   (10.12.07 15:27) [27]

когда то замерял

ADOQuery и ADODataSet на MSSQL и Jet, абсолютно равны по производительности, при ltReadOnly,clUseServer и ctOpenForwardOnly

:) более того на Jet если делать просто тупой цикл
While Not q.Eof Do q.Next;
ADOQuery в два раза быстрее :) ну это понятно ерунда хоть и прикольно... :)


Сергей М.   (2007-12-10 16:04:00) [23]


> DrPass ©   (10.12.07 15:53) [30]


Сегодня ADODataset, завтра еще какой-нить XXXDataset - рано или поздно грабли выстрелят. Именно на этом я и заострил внимание во фразе "засада №1".
Ни более ни менее. Работает оно сейчас у Автора - да ну и слава богу)


Palladin   (2007-12-10 15:58:00) [24]


> Razrab ©   (10.12.07 15:46) [29]

Ты не представляешь на сколько редки подобные ситуции и в связи с их редкостью абсолютно не в падлу сделать count(*)


DrPass   (2007-12-10 15:55:00) [25]


> Ведь скажем, при выводе в тот же Excel, у которого ограничение
> на 65000 строк на лист, куда быстрее после Open узнать кол-
> во записей сразу по RecordCount

Не вижу связи первого со вторым


DrPass   (2007-12-10 15:53:00) [26]


> Сергей М. ©   (10.12.07 15:19) [19]
>
> > Razrab ©   (10.12.07 15:11) [15]
>
>
> По поводу RecordCount - свойство возвращает гарантированно
> правильный результат только в том случае, если предварительно
> был выполнен метод Last.

У ADODataset оно, в отличие от других датасетов, все-таки показывает именно количество записей в наборе, а не количество выфетченных записей. Насколько я знаю, потому что ADODataset в двунаправленном режиме не поддерживает страничный фетч, а сразу тупо фетчит на себя весь датасет.


Razrab   (2007-12-10 15:46:00) [27]

И еще, не пойму как иногда вообще без RecordCount обходиться?! %) Ведь скажем, при выводе в тот же Excel, у которого ограничение на 65000 строк на лист, куда быстрее после Open узнать кол-во записей сразу по RecordCount, нежели перед одним полным Select-ом еще и Select Count(*) выдавать. Смысл?


{RASkov}   (2007-12-10 15:29:00) [28]

> [26] Razrab ©   (10.12.07 15:27)

Усё равно DisableControls не помешает)


sniknik   (2007-12-10 15:27:00) [29]

> надеюсь никакой контрол у тебя к нему не привязан :)
неважно, посмотри реализацию компонент, при явном отключении проверка на одном, верхнем уровне, при отсутствии контрола "на пару этажей ниже".
и раз уж идет борьба за скорость...

в общем советую в любом случае отключать. как и сменить ADOQuery на ADODataSet... советую, советую... а толку нет.


Razrab   (2007-12-10 15:27:00) [30]

Palladin

DBGrid-ов у меня нет.


{RASkov}   (2007-12-10 15:27:00) [31]

> [23] Razrab ©   (10.12.07 15:25)

Не быстрнее....
Только если ты не заметил, то разговор не об этом....)


DiamondShark   (2007-12-10 15:26:00) [32]


> Razrab ©   (10.12.07 15:25) [23]
> Palladin
>
> А почему while то быстрее чем for?

Он не быстрее, он правильнее.
Как тебе уже сказали, RecordCount после открытия не обязан возвращать точное количество записей.


Razrab   (2007-12-10 15:25:00) [33]

Palladin

А почему while то быстрее чем for?


Palladin   (2007-12-10 15:24:00) [34]

да и вообще, если честно, на него вообще полагаться не стОит :) и пользоваться тоже... если конечно не затачивать программу под конкретный провайдер


Palladin   (2007-12-10 15:22:00) [35]


> Сергей М. ©   (10.12.07 15:19) [19]

отнюдь не всегда... во первых провайдер должен поддерживать его, во вторых зависит от кучи (ну на самом деле не такой уж и большой кучи) настроек соединения и объекта RecordSet, например в указанных в моем примере настройках RecordSet'а RecordCount не вернется... по крайней мере это справедливо для Jet и MSSQL


Palladin   (2007-12-10 15:20:00) [36]


> Razrab ©   (10.12.07 15:18) [18]

имеется ввиду XXXDBGrid семейство


Сергей М.   (2007-12-10 15:19:00) [37]


> Razrab ©   (10.12.07 15:11) [15]


По поводу RecordCount - свойство возвращает гарантированно правильный результат только в том случае, если предварительно был выполнен метод Last.

По поводу обращения к объекту-полю по индексу - да, и ощутимо.


Razrab   (2007-12-10 15:18:00) [38]

Palladin


> надеюсь никакой контрол у тебя к нему не привязан :)


Ну как? Сам коннект работает через ADOConnection и ADOQuery, размещенные на форме. Поскольку запросы весьма громоздкие, то в ADOQuery Select-ы занесены в свойство SQL, чтобы кучу всяких кавычек не ставить.


{RASkov}   (2007-12-10 15:15:00) [39]

> [15] Razrab ©   (10.12.07 15:11)

Лучше ответь на [14])
Может у тебя грид скролится во время вывода....


Palladin   (2007-12-10 15:13:00) [40]


> Razrab ©   (10.12.07 15:11) [15]


> обращение к полю по индексу будут быстрее?

ну так надо думать то головой... то ли объекту искать поле по имени в цикле по всем полям сравнением, да еще и с Case-Insentivity, то ли обращатся на прямую к полю в массиве


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо