powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TOraLoader
25 сообщений из 54, страница 1 из 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
25 сообщений из 54, страница 1 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TOraLoader
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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