Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / внешняя библиотека на Си / 18 сообщений из 18, страница 1 из 1
21.06.2016, 12:51:59
    #39259560
relav
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
внешняя библиотека на Си
Вычислительная задача была внесена во внешнюю функцию написанную на Си, для ускорения вычислений. При тестировании
данной функции на Си время оказалось следующим: при первом запуске функции - 20 секунд, а при следующих запусках -0.6 секунд. Я объясняю такую разность показателей времени тем, что оракл при первом запуске функции загружает библиотеку в память, на что тратится время, а при последующих вызовах функции библиотека уже в памяти и следовательно загружать ее не нужно, что отражается на времени. Меня интересует, верно ли я объясняю разницу времени и если верно, то как можно библиотеку раз загрузить и чтоб оракл ее оставил в памяти и не выгружал?
...
Рейтинг: 0 / 0
21.06.2016, 13:09:34
    #39259578
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
внешняя библиотека на Си
relav,

Внешние процедуры запускаются листенером как отдельный процесс. Prespawn настраивается в листенере.
Но 20-0.6 секунд на запуск процесса это перебор. Причина в другом.
...
Рейтинг: 0 / 0
21.06.2016, 13:11:38
    #39259579
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
внешняя библиотека на Си
relavЯ объясняю такую разностьНу я надеюсь ты проанализировал что значит каждая из букв DDL и как выполняется связывание конкретно в Оракле через extproc.
relavможно библиотеку раз загрузить и чтоб оракл ее оставил в памяти и не выгружал?Нельзя. Отдельный экземпляр для каждой сессии.
...
Рейтинг: 0 / 0
21.06.2016, 13:12:42
    #39259580
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
внешняя библиотека на Си
dbms_photoshopкаждая из букв DLLМдэээ...
...
Рейтинг: 0 / 0
21.06.2016, 13:17:35
    #39259583
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
внешняя библиотека на Си
relav,

Сколько занимает первый и последующий вызовы при линковке к своему бинарнику а не к Ораклу?
...
Рейтинг: 0 / 0
21.06.2016, 13:22:44
    #39259588
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
внешняя библиотека на Си
Если вычисления подразумевают выделение заметного объема памяти (особенно мелкими порциями), то дело может быть в этом.
...
Рейтинг: 0 / 0
21.06.2016, 13:22:52
    #39259589
relav
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
внешняя библиотека на Си
dbms_photoshop,

не понимаю, что имеется ввиду?
...
Рейтинг: 0 / 0
21.06.2016, 13:25:05
    #39259591
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
внешняя библиотека на Си
relavdbms_photoshop,
не понимаю, что имеется ввиду?
С очевидностью имеется ввиду чистый эксперимент - выполнение вычислений данной библиотекой без привлечения oracle.
Напишите программку (скорее всего уже написана - ведь тестировали как-то), которая выполнит ровно те же вычисления, что и при вызове через oracle
...
Рейтинг: 0 / 0
21.06.2016, 13:31:02
    #39259598
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
внешняя библиотека на Си
Вряд ли под "вычислениями" подразумевается что-то безумное сложное над 2-мя числами на 20 сек.. А вот дальше вопрос, что дергает автор из этой библиотеки.

Если C-код дергает Oracle-левые ф-ции, то причина может быть банальная: SGA, buffer cache и так далее )))

От замены PL/SQL на C производительность может повысится, а может и понизиться. Сама по себе латинская буква "c" в название языка программирования прирост производительности НЕ гарантирует )))
...
Рейтинг: 0 / 0
21.06.2016, 14:20:54
    #39259647
relav
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
внешняя библиотека на Си
Leonid Kudryavtsev,

а с этим не может быть связана задержка?

After the external procedure completes, the agent remains active throughout your Oracle Database session; when you log off, the agent is killed. Consequently, you incur the cost of launching the agent only once, no matter how many calls you make. Still, you should call an external procedure only when the computational benefits outweigh the cost.
...
Рейтинг: 0 / 0
21.06.2016, 14:44:23
    #39259671
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
внешняя библиотека на Си
Да с чем угодно может быть связана задержка.

Не очень понятно, какую задачу/проблему решаете. В зависимости от задачи - нужно выбирать средство.

Подход "на С быстро, на PL/SQL медленно" очень детский. Так же как и подход "при первом запуске функции - 20 секунд, а при следующих запусках -0.6 секунд. Я объясняю..."

Родные средства Oracle: SQL (Select), PL/SQL, в какой-то мере Java... внешние: C и прочее.

Выигрываете в производительности арифметических операций, проигрываете в необходимости осуществлять вызовы и передавать данные.

-2-Внешние процедуры запускаются листенером как отдельный процесс. Prespawn настраивается в листенере.
Но 20-0.6 секунд на запуск процесса это перебор. Причина в другом.
Плюсуюсь.

Возможно у автора сами вычисления быстрые, а при первом вызове выполняется какая-то долгая инициализация данных. Но это все равно проблема алгоритма/программиста, а не Oracle.
...
Рейтинг: 0 / 0
21.06.2016, 16:23:43
    #39259775
orawish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
внешняя библиотека на Си
Leonid KudryavtsevДа с чем угодно может быть связана задержка.

Не очень понятно, какую задачу/проблему решаете. В зависимости от задачи - нужно выбирать средство.

Подход "на С быстро, на PL/SQL медленно" очень детский . Так же как и подход "при первом запуске функции - 20 секунд, а при следующих запусках -0.6 секунд. Я объясняю..."

Родные средства Oracle: SQL (Select), PL/SQL, в какой-то мере Java... внешние: C и прочее.

Выигрываете в производительности арифметических операций, проигрываете в необходимости осуществлять вызовы и передавать данные.

-2-Внешние процедуры запускаются листенером как отдельный процесс. Prespawn настраивается в листенере.
Но 20-0.6 секунд на запуск процесса это перебор. Причина в другом.
Плюсуюсь.

Возможно у автора сами вычисления быстрые, а при первом вызове выполняется какая-то долгая инициализация данных. Но это все равно проблема алгоритма/программиста, а не Oracle.
+1
я бы назвал - "святая" истина предпоследнего десятилетия прошлого века
2 ТС
с той поры столько "более других" вариантов явилось и пере-появилось (и это потому, что оно таки болело )
короче, имхо, хотите си - пишите на си, но не забывайте сравнить решение с pl/sql + (например) реалнативкомпиляцией
...
Рейтинг: 0 / 0
22.06.2016, 03:12:22
    #39260051
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
внешняя библиотека на Си
-2-relav,

Внешние процедуры запускаются листенером как отдельный процесс. Prespawn настраивается в листенере.
Но 20-0.6 секунд на запуск процесса это перебор. Причина в другом.Про какой Prespawn идет речь?

Может, имеется ввиду Multithreaded extproc Agent ?
...
Рейтинг: 0 / 0
23.06.2016, 15:49:25
    #39261104
Cristiano_Rivaldo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
внешняя библиотека на Си
В коде библиотеки есть функция malloc ?
...
Рейтинг: 0 / 0
28.06.2016, 17:31:03
    #39264064
relav
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
внешняя библиотека на Си
Cristiano_Rivaldo,

в коде есть функции OCIMemoryAlloc().

Я делал замер времени в си коде с помощью функции clock и результат оказался удивительным. Время выполнения си программы занимает 5 секунд, а когда вызываешь программу из оракла, оракл отрабатывает 20 секунд, куда девается 15 секунд - не понятно.
Код pl/sql привожу:
Код: plsql
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.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
 FUNCTION f_getOffsettedQuality(locationId integer, locationType integer) RETURN quality_tab
  IS
      l_quality_level quality_tab := quality_tab();
      l_level varchar2(10) := 0;
      lMinx float;
      lMaxX float;
      lMinY float;
      lMaxY float;
      cnt integer;
      lcity_id integer;
      locBlob BLOB;
      gsmOffset integer := 100; --default value for location offsetting
      umtsOffset integer := 100; --default value for location offsetting
      OffsetX    Number ; 
      OffsetY    Number ;       
      l_offset1 Binary_Integer := 0;
      l_offset2 Binary_Integer := 0;
      l_area    Double precision:=0.0;
      l_proc    Double Precision :=0.0;  
      cover binary_integer;      
      c varchar2(100);
  BEGIN
       IF locationType = 0 THEN--house
            
           Select hg.gis_xmin, hg.gis_xmax, hg.gis_ymin, hg.gis_ymax, s.city 
             into lMinx, lMaxX, lMinY, lMaxY,lcity_id 
           from house_gis hg 
           Join house h On hg.id = h.id
           Join street s On h.street = s.id
           where hg.id = locationId;
           --check if exists config for city_id and get offsetting
           select count(*) 
             into cnt 
           from DICT.CITY_CONFIG cc 
           where cc.city_id = lcity_id;
           
           if cnt > 0 then 
               select nvl(cc.sig_house_gsm, gsmOffset), nvl(cc.sig_house_3g, umtsOffset) 
                 into gsmOffset, umtsOffset 
               From CITY_CONFIG cc 
               where cc.city_id = lcity_id;
           else  
               select nvl(cc.sig_house_gsm, gsmOffset), nvl(cc.sig_house_3g, umtsOffset) 
                 into gsmOffset, umtsOffset 
               From CITY_CONFIG cc 
               where cc.city_id = 0;
           end if;
           
           select h.gis into locBlob from house_gis h where h.id = locationId;
                     
       ELSIF locationType = 1 THEN--street
           select distinct h.gis_xmin, h.gis_xmax, h.gis_ymin, h.gis_ymax, s.city 
             into lMinx, lMaxX, lMinY, lMaxY, lcity_id 
           from street_gis h, street s 
           where s.id = h.id and h.id = locationId;
           --check if exists config for city_id and get offsetting
           select count(*) 
              into cnt 
           from DICT.CITY_CONFIG cc 
           where cc.city_id = lcity_id;
           
           if cnt > 0 then 
               select nvl(cc.sig_house_gsm, gsmOffset), nvl(cc.sig_house_3g, umtsOffset) 
                  into gsmOffset, umtsOffset 
               from CITY_CONFIG cc 
               where cc.city_id = lcity_id;
           else  
               select nvl(cc.sig_house_gsm, gsmOffset), nvl(cc.sig_house_3g, umtsOffset) 
                 into gsmOffset, umtsOffset 
               from CITY_CONFIG cc 
               where cc.city_id = 0;
           end if;
           
           select h.gis 
             into locBlob 
           from street_gis h 
           where h.id = locationId;
                  
       ELSIF locationType = 2 THEN--city
           select distinct h.gis_xmin, h.gis_xmax, h.gis_ymin, h.gis_ymax, h.id 
             into lMinx, lMaxX, lMinY, lMaxY,lcity_id 
           from city_gis h 
           Join city c On h.id = c.id
           where h.id = locationId;
           --check if exists config for city_id and get offsetting
           select count(*) into cnt 
           from DICT.CITY_CONFIG cc 
           where cc.city_id = lcity_id;
           
           if cnt > 0 then 
               select nvl(cc.sig_house_gsm, gsmOffset), nvl(cc.sig_house_3g, umtsOffset) 
                 into gsmOffset, umtsOffset 
               from CITY_CONFIG cc 
               where cc.city_id = lcity_id;
           end if;
           
           select h.gis 
             into locBlob 
           from city_gis h 
           where h.id = locationId;
                      
       END IF;

       OffsetX := gsmOffset;
       OffsetY := gsmOffset;
       pac_geocoding.p_meters2geo(OffsetX, OffsetY);
          
       FOR r IN 
       (
           SELECT g1.gis, g1.threshold,g1.gis_xmax,g1.gis_xmin,g1.gis_ymax,g1.gis_ymin
           FROM coverage.QUALITY_GIS g1
           WHERE g1.signal_type = 'GSM' AND g1.detail_m = 5
               AND (lMinx - OffsetX < g1.gis_xmax 
               AND lMaxX + OffsetX > g1.gis_xmin 
               AND lMinY - (OffsetY ) < g1.gis_ymax 
               AND lMaxY + (OffsetY ) > g1.gis_ymin) --offsetted bounds..don't ask...
           ORDER BY g1.threshold  DESC       
       )          
       Loop
-- call external c function
              pac_gis.PolygonsIntersection(r.gis,locBlob,r.gis_xmax,r.gis_xmin,r.gis_ymax,r.gis_ymin,cover);

              $IF pac_3g_service.debugging=1 $THEN    
                dbms_output.put_line('threshold ='||r.threshold||' area='||l_area);
              $END            
              
           IF cover = 1  THEN
              l_level := r.threshold;
              EXIT;
           END IF;
       
       END LOOP;
              
       IF l_level != 0 THEN
         l_quality_level.extend();  
         cnt := l_quality_level.count;
         l_quality_level(cnt) := quality_t('',''); 
         l_quality_level(cnt).Standart := 'GSM';  
         l_quality_level(cnt).Sig_Level:= l_level;
         l_level := 0;
         cover   := 0;
       END IF;
      -- ==================================== 
       OffsetX := umtsOffset;
       OffsetY := umtsOffset;
       pac_geocoding.p_meters2geo(OffsetX, OffsetY);
                  
       FOR r IN 
       (
           SELECT g1.id,g1.gis, g1.threshold,g1.gis_xmax,g1.gis_xmin,g1.gis_ymax,g1.gis_ymin
           FROM coverage.QUALITY_GIS g1
           WHERE g1.signal_type = 'UMTS' AND g1.detail_m = 5
               AND (lMinx - OffsetX < g1.gis_xmax 
               AND lMaxX + OffsetX > g1.gis_xmin 
               AND lMinY - (OffsetY ) < g1.gis_ymax 
               AND lMaxY + (OffsetY ) > g1.gis_ymin) --offsetted bounds..don't ask...
           ORDER BY g1.threshold  DESC       
       )          
       Loop
--call external c function        
             pac_gis.PolygonsIntersection(r.gis,locBlob,r.gis_xmax,r.gis_xmin,r.gis_ymax,r.gis_ymin,cover);
             
              $IF pac_3g_service.debugging=1 $THEN    
                dbms_output.put_line('threshold ='||r.threshold||' area='||l_area);
              $END 

           IF cover = 1  THEN
             l_level := r.threshold;
             EXIT;
           END IF;
 
       END LOOP;               
       
       IF l_level != 0 THEN
         l_quality_level.extend();  
         cnt := l_quality_level.count;
         l_quality_level(cnt) := quality_t('','');  
         l_quality_level(cnt).Standart := '3G';  
         l_quality_level(cnt).Sig_Level:= l_level;    
       END IF;
       $IF pac_3g_service.debugging=1 $THEN 
           dbms_output.put_line('f_getQuality rc='||l_quality_level.count);
           FOR r IN 1..l_quality_level.count LOOP
               dbms_output.put_line('standart='||l_quality_level(r).standart||' level='||l_quality_level(r).sig_level);
           END LOOP;
       $END 

       RETURN l_quality_level;
  END;

...
Рейтинг: 0 / 0
28.06.2016, 17:46:09
    #39264077
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
внешняя библиотека на Си
relav,

Для определения узкого места имеет сравнивать один вызов при линковке к сишному бинарнику и один вызов при линковке к Ораклу как тебя уже было сказано. Зачем ты запостил сюда 200 строчек говнокода совершенно непонятно.
Если проблема определить где узкое место в pl/sql - используй dbms_trace/dbms_hprof, но по твоему первому посту проблема определить куда уходит время при первом вызове сишной библиотеки.
Неужели подход по выкидыванию не нужного
...
Рейтинг: 0 / 0
28.06.2016, 17:47:44
    #39264079
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
внешняя библиотека на Си
dbms_photoshoprelav,

Для определения узкого места имеет смысл сравнивать один вызов при линковке к сишному бинарнику и один вызов при линковке к Ораклу как тебя уже было сказано. Зачем ты запостил сюда 200 строчек говнокода совершенно непонятно.
Если проблема определить где узкое место в pl/sql - используй dbms_trace/dbms_hprof, но по твоему первому посту проблема определить куда уходит время при первом вызове сишной библиотеки.
Неужели подход по выкидыванию ненужного так сложен для понимания.Fixed.
...
Рейтинг: 0 / 0
28.06.2016, 18:53:32
    #39264135
Jonhson
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
внешняя библиотека на Си
dbms_photoshop как всегда сама доброта
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / внешняя библиотека на Си / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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