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

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

Сохранение больших объемов данных в файл [D7, PostgreSQL]


Vitalts ©   (2009-08-27 11:48:00) 

Есть проблема, со скоростью записи больших объемов данных.
Zeos справляеться с этой задачей на ура. Даже шустрее самого pgAdmina, но вот незадача, он наотрез отказываеться выдавать результаты на сложные запросы.
Пробовал юзать PostgesDAC, отлично понимает сложные запросы, данные с базы вытаскивает с терпимой скоростью, но вот как доходит дело до сбора данных для записи в файл, труба.
Приведенный код для ZEOS сохраняет данные в txt объемом в 20 Мб отрабатывет за менее чем 30 сек, он же, но с PostgresDACом не справляеться за [b]час[/b].
while ZQuery1.FindNext do
begin
   currrecord:= '';
   for i:= 0 to fieldscount - 2 do
     currrecord:= currrecord + ZQuery1.Fields.Fields[i].AsString + Edit9.Text;
   currrecord:= currrecord + ZQuery1.Fields.Fields[fieldscount-1].AsString;
   txt.SaveNext(currrecord);
end;

Что можете посоветовать? Как ускорить процесс? Уменьшить хотябы скорость отработки кода с текстовыми данными в 50МБ до 15 мин.


Ega23   (2009-08-27 14:05:00) [1]

Тогда [2]


Vitalts   (2009-08-27 13:29:00) [2]


> Создай временную таблицу, в неё селект из исходной, из временной
> - copy


С той базы мне только селектить можно, никаких copy и тем более insertoв.
Можно конечно создать на локальном серве временную и туда селектить с исходной, но к чему такие грабли, ежели можно вытаскивать данные напрямую.


Ega23   (2009-08-27 13:08:00) [3]

Создай временную таблицу, в неё селект из исходной, из временной - copy


Vitalts   (2009-08-27 13:00:00) [4]


> Пиши в файл   c:/test1.txt

Дык 'c:/test.txt' тоже не существует :)
Полюбому, даже если с правами на запись в локаль разберусь, первый пункт мне не побороть.


Медвежонок Пятачок   (2009-08-27 12:47:00) [5]

Нет прав на запись в файл 'c:/test.txt'

Пиши в файл   c:/test1.txt


Vitalts   (2009-08-27 12:20:00) [6]

Появилась новая загвоздка
Нет прав на [b]copy[/b] таблицы (и не даст мне их никто)
Нет прав на запись в файл 'c:/test.txt'


Vitalts   (2009-08-27 12:09:00) [7]

читаю Дж. Уорсли, Дж. Дрейк "PostgreSQL для профессианалов", но задачи идут быстрее моего чтения :(


Ega23   (2009-08-27 12:05:00) [8]


> О_О, именно это я и искал :)


Я тебе бы вообще порекомендовал взять и весь этот хелп прочитать. Там с вдумчивым чтением и пробой некоторых особенностей языка - дня на 2-3.
Зато потом будешь иметь хотя бы представления о возможностях + примерно где искать.


Vitalts   (2009-08-27 12:03:00) [9]


> сохраняй напрямую, это полюбому бастрее будет
> http://www.postgresql.org/docs/8.4/static/sql-copy.html

О_О, именно это я и искал :)
Попробую, а то было хотел уже разбивать запрос на несколько тредов, потом собирать данные с тредов в кучу


Ega23   (2009-08-27 11:58:00) [10]

Если же так необходимо TDataSet использовать, то я бы такой шаблон посоветовал:

with DataSet do
begin
 DisableControls;
 try
   First;
   while not Eof do
   begom
     // Тут сохраняем очередной рекорд в файл
     Next;
   end;
 finally
   EnableControls;
 end;
end;


Ega23   (2009-08-27 11:56:00) [11]

сохраняй напрямую, это полюбому бастрее будет
http://www.postgresql.org/docs/8.4/static/sql-copy.html


Наверх

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