Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TOraLoader / 25 сообщений из 54, страница 1 из 3
17.07.2019, 16:56
    #39838398
Леонов Юрий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TOraLoader
Добрый день!
Возникла необходимость загрузки четко структурированного файла большого объема в таблицу.
Так как использую компоненты ODAC, то грех не воспользоваться уже готовым компонентом.
Только вот по примерам в демках не могу понять, каким именно образом в лоадер пищутся данные из файла.
Вроде и не дремучий я, но все же... Небольшой кусок кода в качестве примера, как грузить данные из файла.

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

Для 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
18.07.2019, 09:05
    #39838567
Леонов Юрий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TOraLoader
Dmitri Krizhanovski,

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

Код: 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
18.07.2019, 11:33
    #39838667
Леонов Юрий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TOraLoader
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
18.07.2019, 11:50
    #39838682
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TOraLoader
просто позанудствую:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

По хорошему все должны рождаться с желанием и возможностями развиваться и учиться.
Может, рано ещё?
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TOraLoader / 25 сообщений из 54, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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