Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Выгрузка из базы / 25 сообщений из 37, страница 1 из 2
19.11.2018, 15:47
    #39735179
Выгрузка из базы
Здравствуйте, прошу помочь мне с советом.
Необходимо выгрузить данные из базы на firebird, записей много, около 15 миллионов. В файл типа .txt, с табуляцией.
Попробовала написать экзешник, который вставлял бы по строке в файл. Работает, но долго.
Подскажите пожалуйста решение!
...
Рейтинг: 0 / 0
19.11.2018, 15:51
    #39735183
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выгрузка из базы
Кареглазая_зая,

Взять IBE - он уже умеет экспорт данных. В плане программирования - накапливать буфер в памяти и сбрасывать на диск не по 1 строке, а порциями по 10-20 тыс строк например.
...
Рейтинг: 0 / 0
19.11.2018, 15:57
    #39735186
KreatorXXI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выгрузка из базы
Кареглазая_зая,

Ну а как долго? Сколько? Длина записи какая? Может чудес не бывает. 15 млн x 100 байт = ~1.5Гиг. Какое время Вас бы устроило?
...
Рейтинг: 0 / 0
19.11.2018, 16:05
    #39735190
Выгрузка из базы
KreatorXXI, ну вот один файл сформировался за 3 часа , примерно 4 мб. Это я разделила по месяцам и по одному признаку
...
Рейтинг: 0 / 0
19.11.2018, 16:06
    #39735191
Выгрузка из базы
DarkMaster, умеет, но с моими объемами не справляется. Я пробовала, он выгружает сначала все, а только потом начинает экспорт
...
Рейтинг: 0 / 0
19.11.2018, 16:18
    #39735196
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выгрузка из базы
Кареглазая_зая,

Ну тогда пиши свой велосипед, я уже сказал как. Советую использовать кстати не Query, а что-то вроде Cursor`а (однонаправленный, не имеет внутреннего буфера для данных) - но это уже зависит от библиотеки.
...
Рейтинг: 0 / 0
19.11.2018, 16:19
    #39735197
KreatorXXI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выгрузка из базы
Кареглазая_заяKreatorXXI, ну вот один файл сформировался за 3 часа , примерно 4 мб. Это я разделила по месяцам и по одному признаку
4 мб - это не 15 млн записей. Но по любому многовато. Не знаю на чём Вы писали, но сброс в текстовый файл должен быть быстр. Сегодня вот здесь обсуждают - 21737021 .
...
Рейтинг: 0 / 0
19.11.2018, 16:20
    #39735199
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выгрузка из базы
Кареглазая_зая,

Так все равно так или иначе все это придется вытягивать по сети. Ваша пробная программа экспорта на чем написана? Покажите примерный алгоритм, подумаем над его оптимизацией.
...
Рейтинг: 0 / 0
19.11.2018, 16:21
    #39735200
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выгрузка из базы
DarkMaster,

и писать данные в Stream. А в Query однонаправленнность и так можно включить
...
Рейтинг: 0 / 0
19.11.2018, 16:24
    #39735201
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выгрузка из базы
Симонов ДенисDarkMaster,

и писать данные в Stream. А в Query однонаправленнность и так можно включить

Ну я привык за много лет к IBO - там есть специализированный TIB_Cursor для таких целей. Query (даже однонаправленная) - это память под зафетченные данные - доп. тормоза по выделению памяти.
...
Рейтинг: 0 / 0
19.11.2018, 16:27
    #39735208
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выгрузка из базы
DarkMaster,

нет в однонаправленных Query предыдущие фетчи не буферизированы, иначе какой в смысл в однонаправленности. Разве что буфер в SQLDA, но он один на все записи
...
Рейтинг: 0 / 0
19.11.2018, 16:40
    #39735224
Выгрузка из базы
Vlad F,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
for i := 1 to 12 do 
  begin
    for j := 1 to 4 do
    begin

    pf := path_file + '\'+IntToStr(i)+'_' +IntToStr(j) +'.txt';
  
    myDataModule.dsetReestr.Close;
    myDataModule.dsetReestr.SelectSQL.Text := sql1; //тут я получаю ID записей которые нужно выгрузить
    myDataModule.dsetReestr.OpenWP([i,j]);

    while not myDataModule.dsetReestr.Eof do
    begin
      myDataModule.dsetReestr2.Close;
      myDataModule.dsetReestr2.SelectSQL.Text := sql2;
      myDataModule.dsetReestr2.OpenWP([myDataModule.dsetReestr.FBN('ID').AsInteger]); //по ID беру данные, которые выгрузить в файл необходимо

      myDataModule.DPolis.Close;
      myDataModule.DPolis.CommandText := sql3;
      myDataModule.DPolis.Parameters.ParamByName('p1').Value:= myDataModule.dsetReestr2.FBN('npolis').AsString;
      myDataModule.DPolis.Parameters.ParamByName('p2').Value:= myDataModule.dsetReestr2.FBN('dr').AsString;
      myDataModule.DPolis.Parameters.ParamByName('p3').Value:= myDataModule.dsetReestr2.FBN('fam').AsString;
      myDataModule.DPolis.Parameters.ParamByName('p4').Value:= myDataModule.dsetReestr2.FBN('im').AsString;
      myDataModule.DPolis.Parameters.ParamByName('p5').Value:= myDataModule.dsetReestr2.FBN('ot').AsString;
      myDataModule.DPolis.Open;
      uid := myDataModule.DPolis.FieldByName('uid').AsInteger; ///этот запрос обращается к другой базе 

      s:= IntToStr(uid) + #9 +
          myDataModule.dsetReestr2.FBN('w').AsString + #9 +
          myDataModule.dsetReestr2.FBN('year_dr').AsString + #9 +
          myDataModule.dsetReestr2.FBN('soc').AsString + #9 +
          myDataModule.dsetReestr2.FBN('inv').AsString + #9 +
          myDataModule.dsetReestr2.FBN('iddr').AsString + #9 +
          myDataModule.dsetReestr2.FBN('ds1').AsString  + #9 +
          myDataModule.dsetReestr2.FBN('code_usl').AsString + #9 +
          myDataModule.dsetReestr2.FBN('sumv_usl').AsString + #9 +
          myDataModule.dsetReestr2.FBN('sumv').AsString + #9 +
          myDataModule.dsetReestr2.FBN('usl_ok').AsString + #9 +
          myDataModule.dsetReestr2.FBN('srok').AsString + #9 +
          myDataModule.dsetReestr2.FBN('otd').AsString + #9 +
          myDataModule.dsetReestr2.FBN('dt_begin').AsString + #9 +
          myDataModule.dsetReestr2.FBN('pr_dispans').AsString + #9;

      WriteString(pf,s); // собираю строку и вставляю в файл
	  
      myDataModule.dsetReestr.Next;
    end;
    end;
  end;



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
procedure WriteString(stF: TFileName; msg: string);
begin
  try
    AssignFile(fLog, stF);
    if FileExists(stF) then
      Append(fLog)
    else
      Rewrite(fLog);
    Writeln(fLog, msg);
    Flush(fLog);
  finally
    CloseFile(fLog);
  end// try
end;
...
Рейтинг: 0 / 0
19.11.2018, 16:51
    #39735230
IBExpert
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выгрузка из базы
Кареглазая_заяDarkMaster, умеет, но с моими объемами не справляется. Я пробовала, он выгружает сначала все, а только потом начинает экспорт

Умеет и справляется.
http://www.ibexpert.net/ibe/index.php?n=Doc.ScriptExecutive#Output
...
Рейтинг: 0 / 0
19.11.2018, 16:54
    #39735231
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выгрузка из базы
Кареглазая_зая,

запрос — источник данных должен быть один. Пиши в FileStream, не надо переоткрывать файл на каждой иттерации.
Для большего быстродействия у Query должно быть выставлено Uniderictional := true
...
Рейтинг: 0 / 0
19.11.2018, 16:56
    #39735232
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выгрузка из базы
Не мудрено, что оно тупит, за ради каждой строчки открывать-закрывать файл, препарировать запрос на каждый чих. Зачем внутри цикла переопределять запрос? Ужас-ужас, короче.
...
Рейтинг: 0 / 0
19.11.2018, 16:58
    #39735235
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выгрузка из базы
Кареглазая_зая,

срочно читаем
http://www.ibase.ru/ibx/
TIBOutputDelimitedFile

обращаю внимание, что запрос должен выполняться в IBSQL, а не в IBQuery или чем-то еще.

а 4мб выгрузки у вас за 3 часа - потому что вы дрюкаете сервер запросом на выгрузку каждой записи.

Код: pascal
1.
2.
3.
4.
5.
    while not myDataModule.dsetReestr.Eof do
    begin
      myDataModule.dsetReestr2.Close;
      myDataModule.dsetReestr2.SelectSQL.Text := sql2;
      myDataModule.dsetReestr2.OpenWP



прямо хоть в учебники, "как не надо делать".
Должен быть ОДИН запрос, выдающий все записи, которые надо выгрузить.
...
Рейтинг: 0 / 0
19.11.2018, 17:06
    #39735238
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выгрузка из базы
ЭТО с ЭТИМ, в форум по Делфи!

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.11.2018, 17:11
    #39735243
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выгрузка из базы
Кареглазая_заяПодскажите пожалуйста решение!

FBExport.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.11.2018, 17:42
    #39735258
Выгрузка из базы
Дело в том, что есть две базы, которые необходимо связать между собой уидом, его я как раз вытаскиваю запросом для каждой записи
...
Рейтинг: 0 / 0
19.11.2018, 17:45
    #39735259
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выгрузка из базы
Симонов ДенисDarkMaster,

нет в однонаправленных Query предыдущие фетчи не буферизированы, иначе какой в смысл в однонаправленности. Разве что буфер в SQLDA, но он один на все записи

Ну, когда-то и я наверное это знал, теперь забыл :)
...
Рейтинг: 0 / 0
19.11.2018, 17:50
    #39735261
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выгрузка из базы
Кареглазая_заяДело в том, что есть две базы, которые необходимо связать между собойШтуковина, которая вам нужна называется репликатор. Будет гораздо дешевле его купить, учитывая насколько "детские" грабли разложены в вашем коде, отлаживать будете долго и мучительно.
...
Рейтинг: 0 / 0
19.11.2018, 19:37
    #39735287
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выгрузка из базы
Кареглазая_зая,

Вот это я не до конца понял, и поэтому прежде чем давать советы по оптимизации приведенного кода, хочу уточнить, как потом предполагается использовать этот текстовый файл с разделителями?
...
Рейтинг: 0 / 0
19.11.2018, 19:38
    #39735288
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выгрузка из базы
Кареглазая_заяДело в том, что есть две базы, которые необходимо связать между собой уидом, его я как раз вытаскиваю запросом для каждой записи
Вот про это был вопрос.
...
Рейтинг: 0 / 0
19.11.2018, 19:46
    #39735292
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выгрузка из базы
МимопроходящийЭТО с ЭТИМ, в форум по Делфи!

Не спугни Заю, противный. Вишь, как все мужики оживились.))
...
Рейтинг: 0 / 0
19.11.2018, 20:10
    #39735300
Выгрузка из базы
Vlad F, предполагается загрузить эти файлы в базу ms sql. Информация нужна стороннему аудитору
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Выгрузка из базы / 25 сообщений из 37, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]