![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Быстрый вывод в текстовый файл?
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, то ли обращатся на прямую к полю в массиве