powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TOraLoader
54 сообщений из 54, показаны все 3 страниц
TOraLoader
    #39838398
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
Возникла необходимость загрузки четко структурированного файла большого объема в таблицу.
Так как использую компоненты ODAC, то грех не воспользоваться уже готовым компонентом.
Только вот по примерам в демках не могу понять, каким именно образом в лоадер пищутся данные из файла.
Вроде и не дремучий я, но все же... Небольшой кусок кода в качестве примера, как грузить данные из файла.

Спасибо.
...
Рейтинг: 0 / 0
TOraLoader
    #39838418
Dmitri Krizhanovski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов Юрий,

Для Loader:
1. Указать таблицу, правой кнопкой мыши на компонете выбрать Create Columns.
2. Определить GetColumnData или OnPutData.
GetColumnData будет вызываться для каждой колонки от первой строки до тех пор пока не вернешь EOF := True
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
procedure TfmMain.GetColumnData(Sender: TObject;
   Column: TDAColumn; Row: Integer; var Value: Variant;
   var EOF: Boolean);
begin
   if Row <= 1000 then begin
      case Column.Index of
         0: Value := Row;
         1: Value := Random(100);
         2: Value := Random*100;
         3: Value := 'abc01234567890123456789';
         4: Value := Date;
      else
         Value := Null;
      end;
   end
   else
      EOF := True;
end; 

в OnPutData делаешь всю работу сам
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
procedure TfmMain.PutData(Sender: TDALoader);
var   
  Count: Integer;   
i: Integer;
begin   
  Count := StrToInt(edRows.Text);   
  for i := 1 to Count do
  begin
      Sender.PutColumnData(0, i, 1);
      Sender.PutColumnData(1, i, Random(100));
      Sender.PutColumnData(2, i, Random*100);
      Sender.PutColumnData(3, i, 'abc01234567890123456789');
      Sender.PutColumnData(4, i, Date);   
  end;
end; 

3. Вызвать Load.
...
Рейтинг: 0 / 0
TOraLoader
    #39838567
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitri Krizhanovski,

это я видел, меня интересует как с файлом работать.
Или же открывать его в потоке и заливать построчно?
...
Рейтинг: 0 / 0
TOraLoader
    #39838568
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Леонов Юрий,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
procedure TfmMain.PutData(Sender: TDALoader);
var   
  i: Integer;
  aList: TStringList;
begin   
  aList.LoadFromFile('test.txt');
  
  for i:= 0 to aList.Count - 1 do
  begin
    Sender.PutColumnData(0, i, 1);
    Sender.PutColumnData(1, i, aList[i]);
  end;
end; 



Например...
...
Рейтинг: 0 / 0
TOraLoader
    #39838667
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zinpubЛеонов Юрий,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
procedure TfmMain.PutData(Sender: TDALoader);
var   
  i: Integer;
  aList: TStringList;
begin   
  aList.LoadFromFile('test.txt');
  
  for i:= 0 to aList.Count - 1 do
  begin
    Sender.PutColumnData(0, i, 1);
    Sender.PutColumnData(1, i, aList[i]);
  end;
end; 



Например...

ну это понятно. Но у меня файлы большие... В теории могут быть по нескольку миллионов записей.
А задача стоит ускорить заливку данных...
...
Рейтинг: 0 / 0
TOraLoader
    #39838682
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
просто позанудствую:

номер строки начинать с 1, а не с нуля, как в примере выше.

procedure PutColumnData (by ColumnIndex)
procedure PutColumnData (by ColumnName)
...
Рейтинг: 0 / 0
TOraLoader
    #39838699
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Леонов Юрий,

Так она и ускорится, но без индексов и констрэйнов...

Естественно для TOraLoader надо создать отдельный Session с ASyncMode'ом
...
Рейтинг: 0 / 0
TOraLoader
    #39838700
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кроик Семёнпросто позанудствую:

номер строки начинать с 1, а не с нуля, как в примере выше.

procedure PutColumnData (by ColumnIndex)
procedure PutColumnData (by ColumnName)

Эт да, подзабыл-скопипастил :-)
...
Рейтинг: 0 / 0
TOraLoader
    #39838712
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гугли bulk load/bulk insert. Не факт, что это вообще на Делфи стоит делать.
...
Рейтинг: 0 / 0
TOraLoader
    #39838717
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я это делал через TOraLoader во времянку, а потом процедура на серваке, которая раскидывала данные по местам
...
Рейтинг: 0 / 0
TOraLoader
    #39838720
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов Юрийну это понятно. Но у меня файлы большие... В теории могут быть по нескольку миллионов записей.
А задача стоит ускорить заливку данных...

Memory-Mapped Files и анализировать вручную?..
...
Рейтинг: 0 / 0
TOraLoader
    #39838724
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvp,

А чем помогут MemoryMapped files?

Читать по одной записи и передавать компоненту... с кэшированием винда сама разбёрется
...
Рейтинг: 0 / 0
TOraLoader
    #39838725
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Или задача залить не все записи из файла?
...
Рейтинг: 0 / 0
TOraLoader
    #39838730
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Человек не в состоянии разобраться как использовать готовый компонент, а вы предлагаете
ему MMF и Direct Path... Оптимисты.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
TOraLoader
    #39838780
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zinpubИли задача залить не все записи из файла?

В идеале файлов будет штук 15 разных. У каждого своя структура, есть общие поля.
Но итоговая таблица общая (44 колонки), есть зависимость, какие данные куда надо ложить.
Но записи должны залиться все, пропуски не запланированы
...
Рейтинг: 0 / 0
TOraLoader
    #39838783
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovЧеловек не в состоянии разобраться как использовать готовый компонент, а вы предлагаете
ему MMF и Direct Path... Оптимисты.

Ну это же хорошо, что вы в этом разобрались. Или все должны родиться со знаниями возможностей компонент ODAC?
До сегодняшнего дня мне этот компонент не был нужен. Вот теперь разбираюсь.
...
Рейтинг: 0 / 0
TOraLoader
    #39838785
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос еще такой, для самоуспокоения: если надо, чтобы загрузка проходила частями частями, то в цикле вызывать метод Load?
...
Рейтинг: 0 / 0
TOraLoader
    #39838792
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Леонов ЮрийzinpubИли задача залить не все записи из файла?

В идеале файлов будет штук 15 разных. У каждого своя структура, есть общие поля.
Но итоговая таблица общая (44 колонки), есть зависимость, какие данные куда надо ложить.
Но записи должны залиться все, пропуски не запланированы

Тогда 15 -> OraLoader'ов, 15 -> Session'ов к ним качают во временные таблицы, асинхронно.
После запускается процедура на сервере, которая агрегирует всё это счастье в итогувую таблицу.
...
Рейтинг: 0 / 0
TOraLoader
    #39838794
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Леонов ЮрийВопрос еще такой, для самоуспокоения: если надо, чтобы загрузка проходила частями частями, то в цикле вызывать метод Load?

Load вызывается один раз, а конец итерации определяете в OnPutData
...
Рейтинг: 0 / 0
TOraLoader
    #39838796
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zinpubТогда 15 -> OraLoader'ов, 15 -> Session'ов к ним качают во временные таблицы, асинхронно.
После запускается процедура на сервере, которая агрегирует всё это счастье в итогувую таблицу.

Не пойму зачем асинхронность, если и столько лоадеров. Есть механизм распознавания, куда и что писать.
...
Рейтинг: 0 / 0
TOraLoader
    #39838807
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zinpubПосле запускается процедура на сервере, которая агрегирует всё это счастье в итогувую таблицу.

Осталось только придумать способ получить доступ к данным во временной таблице другой сессии.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
TOraLoader
    #39838808
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Леонов ЮрийzinpubТогда 15 -> OraLoader'ов, 15 -> Session'ов к ним качают во временные таблицы, асинхронно.
После запускается процедура на сервере, которая агрегирует всё это счастье в итогувую таблицу.

Не пойму зачем асинхронность, если и столько лоадеров. Есть механизм распознавания, куда и что писать.

Если данные(необходимые для загрузки) одинаковые во всех файлах, то количество потоков вещь подбираемая, в зависимости от сервера и того откуда берутся файлы...
...
Рейтинг: 0 / 0
TOraLoader
    #39838809
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovzinpubПосле запускается процедура на сервере, которая агрегирует всё это счастье в итогувую таблицу.

Осталось только придумать способ получить доступ к данным во временной таблице другой сессии.


Я имел в виду ЛОГИЧЕСКИ временные таблицы
...
Рейтинг: 0 / 0
TOraLoader
    #39838810
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В смысле обычные таблицы, которые мы используем, как буферные.
...
Рейтинг: 0 / 0
TOraLoader
    #39838814
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов Юрий,

По хорошему все должны рождаться с желанием и возможностями развиваться и учиться.
Может, рано ещё?
...
Рейтинг: 0 / 0
TOraLoader
    #39838834
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GatorЛеонов Юрий,
По хорошему все должны рождаться с желанием и возможностями развиваться и учиться.
Может, рано ещё?

А я вопрос здесь и задал для того, чтобы понять возможности и принцип работы компоненты.
В официальном мануале практически ничего не сказано, кроме того что нужно определить одно из событий и вызвать метод Load.
И пойми как оно работает... Как коммиты ставятся и ставятся ли вообще.
В нете раскопал старый код
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
procedure TDALoader.Load; 
begin 
  if Columns.Count = 0 then 
    CreateColumns; 
  Prepare; 
  StartWait; 
  try 
    PutData; 
  finally 
    Finish; 
    StopWait; 
  end; 
end; 


Здесь один раз дергается одно из событий. Что человек, который только начал знакомиться с компонентом, должен понять ?
...
Рейтинг: 0 / 0
TOraLoader
    #39838842
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Леонов Юрий,

Это кривой код...

Комитов при bulk load ,как таковых нету - это совсем другой механизм...
...
Рейтинг: 0 / 0
TOraLoader
    #39838843
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов Юрий, ну ты данные то "запутил" в БД? Обработчики событий (on...) написаны? что пишут? Контролируешь?
...
Рейтинг: 0 / 0
TOraLoader
    #39838851
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zinpub, другого кода у меня нету. Я не понимаю принципа. Вот в самом первом вашем посте был пример события onGetColumnData.
Если данных 10 тысяч строк, сколько раз выполнится это событие и почему? Можете растолковать?
...
Рейтинг: 0 / 0
TOraLoader
    #39838856
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Леонов Юрийzinpub, другого кода у меня нету. Я не понимаю принципа. Вот в самом первом вашем посте был пример события onGetColumnData.
Если данных 10 тысяч строк, сколько раз выполнится это событие и почему? Можете растолковать?

onGetColumnData - выполняется до тех пор пока вы не определите Eof = True
...
Рейтинг: 0 / 0
TOraLoader
    #39838857
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов Юрий, при чем тут число строк?

https://www.devart.com/unidac/docs/devart.dac.tdaloader.ongetcolumndata.htm Write the OnGetColumnData event handler to put column values. TDALoader calls the OnGetColumnData event handler for each column in the loop. Column points to a TDAColumn object that corresponds to the current loading column. Use its Name or Index property to identify what column is loading. The Row parameter indicates the current loading record. TDALoader increments the Row parameter when all the columns of the current record are loaded. The first row is 1. Set EOF to True to stop data loading. Fill the Value parameter by column values. To start loading call the Load method.

Another way to load data is using the OnPutData event.
...
Рейтинг: 0 / 0
TOraLoader
    #39838859
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне было удобнее с PutData...

То есть логика такова:
Ты сам берёшь данные - откуда хочешь... из строки, стрима, файла, хоть рэндомом их генеришь
Передаешь компоненту
Он кладёт их в базу

Как только тебе надоело выходишь из процедуры...
...
Рейтинг: 0 / 0
TOraLoader
    #39838867
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zinpubМне было удобнее с PutData...

То есть логика такова:
Ты сам берёшь данные - откуда хочешь... из строки, стрима, файла, хоть рэндомом их генеришь
Передаешь компоненту
Он кладёт их в базу

Как только тебе надоело выходишь из процедуры...
То есть командой
Код: pascal
1.
Sender.PutColumnData(2, FLineN, FLineN);


мы забиваем данные, а потом Load их пуляет по назначению? И после я сам вызываю коммит? Я правильно понял?
...
Рейтинг: 0 / 0
TOraLoader
    #39838868
Фотография devart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При установке ODAC по умолчанию устанавливаются и несколько демо проектов. Если вы откроете папку с Demo, то увидете там демо с названием OdacDemo. В этом демо есть и пример по работе с TOraLoader через GetColumnData и через PutData (исходники для демо по работе с TOraLoader находятся тут: OdacDemo\Loader\Loader.pas).
...
Рейтинг: 0 / 0
TOraLoader
    #39838871
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да сорри за опечатку, я имел ввиду PutData
...
Рейтинг: 0 / 0
TOraLoader
    #39838873
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
devartПри установке ODAC по умолчанию устанавливаются и несколько демо проектов. Если вы откроете папку с Demo, то увидете там демо с названием OdacDemo. В этом демо есть и пример по работе с TOraLoader через GetColumnData и через PutData (исходники для демо по работе с TOraLoader находятся тут: OdacDemo\Loader\Loader.pas).

Да, я видел демку. По крайней мере смотрел код
...
Рейтинг: 0 / 0
TOraLoader
    #39838874
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Леонов ЮрийzinpubМне было удобнее с PutData...

То есть логика такова:
Ты сам берёшь данные - откуда хочешь... из строки, стрима, файла, хоть рэндомом их генеришь
Передаешь компоненту
Он кладёт их в базу

Как только тебе надоело выходишь из процедуры...
То есть командой
Код: pascal
1.
Sender.PutColumnData(2, FLineN, FLineN);


мы забиваем данные, а потом Load их пуляет по назначению? И после я сам вызываю коммит? Я правильно понял?

Load и вызовет OnPutData... Пуляет данные PutColumnData.... Коммит "не нужен"(с)
...
Рейтинг: 0 / 0
TOraLoader
    #39838877
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zinpubLoad и вызовет OnPutData... Пуляет данные PutColumnData.... Коммит "не нужен"(с)

Спасибо огромное за разъяснения!
...
Рейтинг: 0 / 0
TOraLoader
    #39838882
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оказывается рано обрадовался...
При вызове Load бьет ошибку "Direct path loading is not supported in Direct mode"
Основное требование заказчика при подключении к БД - никаких клиентов, только Direct...
Обойти как-то можно?
...
Рейтинг: 0 / 0
TOraLoader
    #39838923
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например промежуточный слой на сервере.
Да хоть бы веб-сервер. Получает файл/ы, распарсивает и заливает в базу. Уж на сервере то оракл-клиент скорее всего установлен.
...
Рейтинг: 0 / 0
TOraLoader
    #39838936
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Леонов ЮрийОказывается рано обрадовался...
При вызове Load бьет ошибку "Direct path loading is not supported in Direct mode"
Основное требование заказчика при подключении к БД - никаких клиентов, только Direct...
Обойти как-то можно?

Нет
...
Рейтинг: 0 / 0
TOraLoader
    #39838937
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BulkLoad можно выполнить со стороны Pl/Sql из блоба или файла
...
Рейтинг: 0 / 0
TOraLoader
    #39838941
Фотография devart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов ЮрийОказывается рано обрадовался...
При вызове Load бьет ошибку "Direct path loading is not supported in Direct mode"
Основное требование заказчика при подключении к БД - никаких клиентов, только Direct...
Обойти как-то можно?
Можно выбрать режим lmDML : https://www.devart.com/odac/docs/devart.odac.tloadmode.htm
...
Рейтинг: 0 / 0
TOraLoader
    #39838998
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
devartМожно выбрать режим lmDML

а есть разница между imDML и серией INSERT'ов через dataset или query?
...
Рейтинг: 0 / 0
TOraLoader
    #39839049
Фотография devart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроик СемёнdevartМожно выбрать режим lmDML
а есть разница между imDML и серией INSERT'ов через dataset или query?
В режиме lmDML используется вставка с помощью обычного INSERT, только параметры передаются как DML array (подробнее про DML arrays можно прочитать тут https://www.devart.com/odac/docs/work_dml.htm ). Режим lmDML у TOraLoader сделан для тех случаев, когда у кого-то реализована загрузка данных через TOraLoader, но в один прекрасный момент возникает необходимость работать в Direct режиме, в котором загрузка данных в режиме lmDirect не поддерживается. В этом случае достаточно переключить режим с lmDirect на lmDML и ничего не надо переписывать в своем приложении. Скорость загрузки данных в режиме lmDirect немного выше, чем в lmDML режиме, но разница в скорости столько мизерная, что можно ей можно принебречь и считать эти два режма полностью взаимозаменяемыми.
...
Рейтинг: 0 / 0
TOraLoader
    #39839273
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
devartВ режиме lmDML используется вставка с помощью обычного INSERT, только параметры передаются как DML array.

Если я правильно понял, то в
Код: pascal
1.
Sender.PutColumnData(Col, Row, Value);

Value будет представлен как VarArray?
Или же как в примере делаем через OraSQL?
...
Рейтинг: 0 / 0
TOraLoader
    #39839294
Фотография devart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов ЮрийЕсли я правильно понял, то в
Код: pascal
1.
Sender.PutColumnData(Col, Row, Value);

Value будет представлен как VarArray?
Или же как в примере делаем через OraSQL?
Нет, данные в PutColumnData вы заполняете одинаково в обоих режимах. В режиме lmDML компонент TOraLoader сам преобразует их в DML Array и в виде массива отправит на сервер.
...
Рейтинг: 0 / 0
TOraLoader
    #39839319
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
devartНет, данные в PutColumnData вы заполняете одинаково в обоих режимах. В режиме lmDML компонент TOraLoader сам преобразует их в DML Array и в виде массива отправит на сервер.

Тогда тоска... Миллион записей 10 минут гонял. За это же время SQLLoader загнал 20 лямов
...
Рейтинг: 0 / 0
TOraLoader
    #39839462
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов ЮрийЗа это же время SQLLoader загнал 20 лямов

Так надо же сравнивать в равных условиях. Снеси с машины клиент Oracle (в соответствии с
требованиями доступа без его установки) и посмотри как SQLoader выкрутится.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
TOraLoader
    #39839977
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovЛеонов ЮрийЗа это же время SQLLoader загнал 20 лямов

Так надо же сравнивать в равных условиях. Снеси с машины клиент Oracle (в соответствии с
требованиями доступа без его установки) и посмотри как SQLoader выкрутится.


Так это без клиента и было сделано...
...
Рейтинг: 0 / 0
TOraLoader
    #39840008
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов ЮрийdevartНет, данные в PutColumnData вы заполняете одинаково в обоих режимах. В режиме lmDML компонент TOraLoader сам преобразует их в DML Array и в виде массива отправит на сервер.

Тогда тоска... Миллион записей 10 минут гонял. За это же время SQLLoader загнал 20 лямов
Дык, режь данные на куски в виде файлов и запускай с ними SQLLoader-ы в отдельных потоках. Проведенные эксперименты показали, что быстрее все равно ничего не будет.
...
Рейтинг: 0 / 0
TOraLoader
    #39840073
Фотография devart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов ЮрийdevartНет, данные в PutColumnData вы заполняете одинаково в обоих режимах. В режиме lmDML компонент TOraLoader сам преобразует их в DML Array и в виде массива отправит на сервер.

Тогда тоска... Миллион записей 10 минут гонял. За это же время SQLLoader загнал 20 лямов
Мы исследовали описанное вами поведение. Такая разница в скорости вставки обусловленна тем, что в режиме lmDML вставка производится блоками по 100 записей. К сожалению опции, которая повлияла бы на данное поведение в настоящий момент нет. Поэтому для ускорения вставки мы можем вам порекомендовать два решенеия:

Первое, если у вас ODAC с исходным кодом, то вы можете отрыть файл OraClasses.pas и найти там строчку (в методе TOCILoader.Prepare):
Код: pascal
1.
FBufNumRows := 100;


и попробовать заменить значение 100 на значение 1000 или на 10000. скорость вставки должна значительно увеличится.

Второй способ - это самостоятельно реализовать вставку через DML arrays, как описано здесь https://www.devart.com/odac/docs/batchops.htm
В этом случае также необходимо подобрать оптимальное значение для количества строк вставляемых за раз. При самостоятельной реализации вставки через DML array следует избегать использования метода ParamByName() и обращаться к параметрам по индексу, иначе вызов метода ParamByName() миллион раз для каждого араметра может очень сильно снизить производительность.
...
Рейтинг: 0 / 0
TOraLoader
    #39842033
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
devartМы исследовали описанное вами поведение. Такая разница в скорости вставки обусловлена тем, что в режиме lmDML вставка производится блоками по 100 записей. К сожалению опции, которая повлияла бы на данное поведение в настоящий момент нет. Поэтому для ускорения вставки мы можем вам порекомендовать два решения:

Первое, если у вас ODAC с исходным кодом, то вы можете отрыть файл OraClasses.pas и найти там строчку (в методе TOCILoader.Prepare):
Код: pascal
1.
FBufNumRows := 100;


и попробовать заменить значение 100 на значение 1000 или на 10000. скорость вставки должна значительно увеличится.

Второй способ - это самостоятельно реализовать вставку через DML arrays, как описано здесь https://www.devart.com/odac/docs/batchops.htm
В этом случае также необходимо подобрать оптимальное значение для количества строк вставляемых за раз. При самостоятельной реализации вставки через DML array следует избегать использования метода ParamByName() и обращаться к параметрам по индексу, иначе вызов метода ParamByName() миллион раз для каждого араметра может очень сильно снизить производительность.

Попробовал оба варианта. Немного причесал код (были проблемы со значениями, может поэтому грузило очень долго). Теперь миллионник залетает за 2 минуты)) Это через TOraLoader.
Практически тот же код, но через TOraSQL и DML Array зашел за 4 минуты. Блоки по 65000 записей
...
Рейтинг: 0 / 0
TOraLoader
    #39842034
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаю, что на данном этапе проблема решена. Спасибо всем за участие. Особая благодарность "zinpub" и "devart" !
...
Рейтинг: 0 / 0
54 сообщений из 54, показаны все 3 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TOraLoader
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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