powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Поиск по ресурсам
25 сообщений из 39, страница 1 из 2
Поиск по ресурсам
    #39265440
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня господа !

Имею тему

Функция Java внедренная в базу Oracle
В ней ресурс на 40 тыс срок (текст)
По нему необходимо организовать поиск

- поиск по kind,duration,grace,monthly
- возврат amount[],unpaid[],outstanding[]

- оптимизация
if(i==(duration+1)*3) break; - прерывание если набор данных уже заполнен, т.е. цикл не работает по всему ресурсу
- сверху расположены группы, которые по статистике втречаются чаще в вызывающем потоке

Делаю так
Код: java
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.
	private void LoadProfil(String resource,String kind,int duration,int grace,Double monthly,Double amount[],Double unpaid[],Double outstanding[]) 
    throws IOException 
	{
		InputStream is = this.getClass().getResourceAsStream(resource);
		InputStreamReader ir = new InputStreamReader(is);
		BufferedReader br = new BufferedReader(ir);
		int i=0;
		String  line;
		while ((line = br.readLine()) != null) 
		{
			String[] parts = line.split(",");
			if (   parts[1].equals(kind)
				&& duration >= Double.parseDouble(parts[2])  	
				&& duration <= Double.parseDouble(parts[3])  	
				&& grace    >= Double.parseDouble(parts[4])  	
				&& grace    <= Double.parseDouble(parts[5])  	
				&& monthly  >= Double.parseDouble(parts[6])  	
				&& monthly  <= Double.parseDouble(parts[7])  
				&& duration >= Double.parseDouble(parts[8]) 
			   ) 
			{
				if(parts[0].equals("AMOUNT"     )){      amount[Integer.parseInt(parts[8])] = Double.parseDouble(parts[9]); i++;}
				if(parts[0].equals("UNPAID"     )){      unpaid[Integer.parseInt(parts[8])] = Double.parseDouble(parts[9]); i++;}
				if(parts[0].equals("OUTSTANDING")){ outstanding[Integer.parseInt(parts[8])] = Double.parseDouble(parts[9]); i++;}
				if(i==(duration+1)*3) break;  
			}
		}
		br.close();
		ir.close();
		is.close();
	}



Общая продолжительность поиска достаточно высока, так как запускается сама функция 15-20 тыс раз
Подскажите нет ли в java типов, механизмов которые осуществили ли мне быструю реализация

Заранее благодарен !
...
Рейтинг: 0 / 0
Поиск по ресурсам
    #39265447
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

Ресурс выглядит так
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
AMOUNT,POS_Pos_Comfy,0.0000,84.0000,0.0000,0.0000,0.0000,0.5000,0,0.00000000
AMOUNT,POS_Pos_Comfy,0.0000,84.0000,0.0000,0.0000,0.0000,0.5000,1,0.00000000
AMOUNT,POS_Pos_Comfy,0.0000,84.0000,0.0000,0.0000,0.0000,0.5000,2,0.00500124
AMOUNT,POS_Pos_Comfy,0.0000,84.0000,0.0000,0.0000,0.0000,0.5000,3,0.00957669
AMOUNT,POS_Pos_Comfy,0.0000,84.0000,0.0000,0.0000,0.0000,0.5000,4,0.01556268
AMOUNT,POS_Pos_Comfy,0.0000,84.0000,0.0000,0.0000,0.0000,0.5000,5,0.01837840
AMOUNT,POS_Pos_Comfy,0.0000,84.0000,0.0000,0.0000,0.0000,0.5000,6,0.02344896
AMOUNT,POS_Pos_Comfy,0.0000,84.0000,0.0000,0.0000,0.0000,0.5000,7,0.03395024
AMOUNT,POS_Pos_Comfy,0.0000,84.0000,0.0000,0.0000,0.0000,0.5000,8,0.04275083
AMOUNT,POS_Pos_Comfy,0.0000,84.0000,0.0000,0.0000,0.0000,0.5000,9,0.05045687
AMOUNT,POS_Pos_Comfy,0.0000,84.0000,0.0000,0.0000,0.0000,0.5000,10,0.05385495
AMOUNT,POS_Pos_Comfy,0.0000,84.0000,0.0000,0.0000,0.0000,0.5000,11,0.06786924
AMOUNT,POS_Pos_Comfy,0.0000,84.0000,0.0000,0.0000,0.0000,0.5000,12,0.08264786
AMOUNT,POS_Pos_Comfy,0.0000,84.0000,0.0000,0.0000,0.0000,0.5000,13,0.11315307
AMOUNT,POS_Pos_Comfy,0.0000,84.0000,0.0000,0.0000,0.0000,0.5000,14,0.11896008
...
Рейтинг: 0 / 0
Поиск по ресурсам
    #39265489
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X...так как запускается сама функция 15-20 тыс раз
Подскажите нет ли в java типов, механизмов которые осуществили ли мне быструю реализация
создать нормальный тип/класс.

Один раз загрузить (распарсить ресурс), потом работать по уже загруженным данным.

В чем проблема, не понятно.
...
Рейтинг: 0 / 0
Поиск по ресурсам
    #39265553
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

А почему бы этот "ресурс" не загрузить в базу, как таблицу?
...
Рейтинг: 0 / 0
Поиск по ресурсам
    #39265725
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GarrickHOME_X,
А почему бы этот "ресурс" не загрузить в базу, как таблицу?


Причина - архитектурного характера, функция будет находиться в базе
но не будет иметь непосредственной связи с базой
...
Рейтинг: 0 / 0
Поиск по ресурсам
    #39265739
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevHOME_X...так как запускается сама функция 15-20 тыс раз
Подскажите нет ли в java типов, механизмов которые осуществили ли мне быструю реализация
создать нормальный тип/класс.

Один раз загрузить (распарсить ресурс), потом работать по уже загруженным данным.

В чем проблема, не понятно.


Не понял Вас

У меня есть функция Java (вызывается SQL запросом) в ней ресурс (40 тыс. записей)
Функция вызвалась - произошло распар-е ресурса, функция отработала, память очистилась
Следующая запись SQL снова вызывает функцию - распар-е - возврат результата , очистка.

Итак 20-30 тыс. записей = 20-30 тыс. вызовов функции.

Или знаете другой пример, прошу привести

Заранее благодарен !
...
Рейтинг: 0 / 0
Поиск по ресурсам
    #39265742
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XПричина - архитектурного характера, функция будет находиться в базе
но не будет иметь непосредственной связи с базой
Что мешает эту связь добавить? Вы понимаете, что вы хотите свою собственную БД на базе текстового файла внутри уже существующей БД?
...
Рейтинг: 0 / 0
Поиск по ресурсам
    #39265764
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XСледующая запись SQL снова вызывает функцию - распар-е - возврат результата , очистка.

Итак 20-30 тыс. записей = 20-30 тыс. вызовов функции.

1) Традиционный способ.

Распарсить, вызвать N-раз функцию в пределах SQL, очистить память (или руками или при окончании сессии Oracle).

Oracle под рукой нет, да и приложение Ваше не знаю, но парсить 20-30 тыс. раз на каждое обращение в SELECT - это жесть.
...
Рейтинг: 0 / 0
Поиск по ресурсам
    #39265771
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Более чем понимаю.....
мне нужна единая JAR библиотека, которая будет вызываться интегрироваться
и вызываться не только из базы., а из под Windows

Соответственно эдакой набор констант приходиться держать во внутри исполь-го файла.
Увы....
...
Рейтинг: 0 / 0
Поиск по ресурсам
    #39265776
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но не в виде же текста, в конце концов!

И падеж типов в коде, тоже доставляет. Параметр с типом int, а парсинг и сравнение идет с Double
...
Рейтинг: 0 / 0
Поиск по ресурсам
    #39265778
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

Тогда вам нужна любая легковесная БД типа SQLite, HSQL, H2, JavaDB/Derby. Можно её, конечно, написать самому, но зачем?
...
Рейтинг: 0 / 0
Поиск по ресурсам
    #39265779
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и на худой конец, откройте хотя бы для себя паттерн Singleton

Желательно почитать, что значит слово cache. Но тут советовать не берусь, т.к. не знаю Ваши объемы данных, где все это будет исполняться и насколько много разных ресурсов.
...
Рейтинг: 0 / 0
Поиск по ресурсам
    #39265786
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczТогда вам нужна любая легковесная БД типа SQLite, HSQL, H2, JavaDB/Derby. Можно её, конечно, написать самому, но зачем?
Нафига? Явно конструкции вида:

duration >= Double.parseDouble(parts[2])
duration <= Double.parseDouble(parts[3])
grace >= Double.parseDouble(parts[4])
grace <= Double.parseDouble(parts[5])
monthly >= Double.parseDouble(parts[6])
monthly <= Double.parseDouble(parts[7])
duration >= Double.parseDouble(parts[8])

по индексам фактически не соптимизируются. А использовать СУБД для тупого перебора... можно и самому в коде перебрать, еще и быстрее будет (если работать в памяти и руки иметь прямые)

IMHO
...
Рейтинг: 0 / 0
Поиск по ресурсам
    #39265788
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

Извините не понял Вас

По пунктам
1. java класс внедрен в базу Oracle
2. заведен тип базы который отвечает за связь с эти классом
3. делаем вызов SQL запроса, который ссылается на этот тип базы

Пример
Код: java
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.
create or replace type ttNbi as object
(
  contract         VARCHAR2(14),
  segment          VARCHAR2(2),
  .........................................
  nbi              NUMBER(18,8),

  constructor function ttNbi(
                             contract         VARCHAR2,
                             segment          VARCHAR2,
                             .....................................
                             sms_rate         NUMBER
                            ) return self as result,
     static function Execute(
                             contract         in out VARCHAR2,
                             segment          in out VARCHAR2,
                             .............................................
                             nbi              in out NUMBER
                            ) return varchar2
external name 'Analitic.Irr.Execute
                            (
                             java.lang.String[],
                             java.lang.String[],
                             ..........................
                             oracle.sql.NUMBER[]
                            ) return java.lang.String[]'
);
                     

create or replace type body ttNbi as

  constructor function ttNbi(contract         VARCHAR2,
                             segment          VARCHAR2,
                             program          VARCHAR2,
                             ....................................
                             sms_rate         NUMBER
                            ) return self as result
  as begin 
    declare 
      s varchar2(10);
    begin
      self.contract       :=contract;
      self.segment        :=segment;
      ........................................
      self.sms_rate       :=sms_rate;
      s:=ttNbi.Execute(self.contract,         
                       self.segment,          
                       ...........................
                       self.nbi
                      );
      return;
    end;
  end;
end;                     
                     
select A.NBI.CONTRACT,
       A.NBI.IRR,
       A.NBI.APR,
       A.NBI.AMO,
       A.NBI.NBI  
  from (
        select A.*,
               ttNbi(A.contract, 
                     A.segment,
                     ....................
                     A.sms_rate
                    ) NBI 
          from (
                select id_contract_sap   contract,
                       To_char(rsegment) segment,
                       ..................
                       sms_rate 
                  from LIST
               ) A  
       ) A 



Прошу Вас описать Ваше предложение на маленьком примере
...
Рейтинг: 0 / 0
Поиск по ресурсам
    #39265792
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

По поводу текущего кода.
- Загрузите данные в память, а не читайте из ресурсов.
- Используйте любой простейший индекс для kind. Хотя бы HashMap.
В принцпе, если записей в каждом kind не много, то итерация по одной группе будет достаточно быстрой.
Но можно и внутри каждого kind сгруппировать следующий параметр и оптимизировать его поиск аналогичным способом.
...
Рейтинг: 0 / 0
Поиск по ресурсам
    #39265794
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczHOME_X,

Тогда вам нужна любая легковесная БД типа SQLite, HSQL, H2, JavaDB/Derby. Можно её, конечно, написать самому, но зачем?


Как это ставить на N- пользовательских ПК ?
Разрешение СБ и т.д.
...
Рейтинг: 0 / 0
Поиск по ресурсам
    #39265799
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XПрошу Вас описать Ваше предложение на маленьком примере
1. Загрузку и разбор по строкам и по полям нужно делать один раз для всех данных. Результат хранить в статическом поле. Надо вообще почитать как именно там Oracle экземплярами JVM управляет. Могут быть нюансы.

Это уже вам даст огромный прирост скорости. Если этого не достаточно, оптимизируйте перебор.
2. То что вы загрузили, поместите в структуру HashMap<String, MyDomainModelTextFileRecordName>. Заполняйте её при чтении в п.1, так чтобы ключом сделать, например, группу.

Померяйте производительность ещё раз. Если снова недостаточная, можно сделать
3. второй индекс HashMap<String, HashMap<String, MyDomainModelTextFileRecordName>>, где первый ключ это kind, а второй - че у вас там в первой колонке.

Сколько у вас таких файлов?
...
Рейтинг: 0 / 0
Поиск по ресурсам
    #39265800
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XBlazkowiczHOME_X,

Тогда вам нужна любая легковесная БД типа SQLite, HSQL, H2, JavaDB/Derby. Можно её, конечно, написать самому, но зачем?


Как это ставить на N- пользовательских ПК ?
Разрешение СБ и т.д.
Embedded. Точно так же как вы подключаете jar вашего проекта.
...
Рейтинг: 0 / 0
Поиск по ресурсам
    #39265802
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev можно и самому в коде перебрать, еще и быстрее будет (если работать в памяти и руки иметь прямые)


как хранить поток, изначально описать как типовой массив ? на 40 тыс. записей

Если это "...Хотя бы HashMap...." откуда его грузить ?
...
Рейтинг: 0 / 0
Поиск по ресурсам
    #39265803
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XЕсли это "...Хотя бы HashMap...." откуда его грузить ?
? Из вашего файла.
...
Рейтинг: 0 / 0
Поиск по ресурсам
    #39265810
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X1. java класс внедрен в базу Oracle
2. заведен тип базы который отвечает за связь с эти классом
3. делаем вызов SQL запроса, который ссылается на этот тип базы

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

Blazkowicz- Загрузите данные в память, а не читайте из ресурсов.

Вот и я об этом!

1)
При этом, создавать классы Home_X вроде умеет (я такого в Oracle не умею)

Ну загрузи ты в конструкторе ресурс, а в ф-ции обработки (разумеется НЕ static) им и пользуйся

Ну и понятное дело, не понятно, нафига нужно создавать экземпляр на каждую исходную запись.

2)
Даже не умея создавать классы/экземпляры, никто не мешает сделать Singleton и там закешировать загруженный ресурс. Жить правда будет наверное до конца Oracle сесии, т.ч. это опасная идея (смотря как реализовать) - но в качестве костыля, вполне.

IMHO

p.s. Примера не будет, Oracle под руками нет, да и желания нет. Я лучше пива выпью.
...
Рейтинг: 0 / 0
Поиск по ресурсам
    #39265814
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

Если у вас файлов много, то добавьте внутри них свой индекс, чтобы не читать каждую строку, а по индексу быстро найти нужный блок файла.
...
Рейтинг: 0 / 0
Поиск по ресурсам
    #39265816
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczHOME_XПрошу Вас описать Ваше предложение на маленьком примере
1. Загрузку и разбор по строкам и по полям нужно делать один раз для всех данных. Результат хранить в статическом поле. Надо вообще почитать как именно там Oracle экземплярами JVM управляет. Могут быть нюансы.

Это уже вам даст огромный прирост скорости. Если этого не достаточно, оптимизируйте перебор.
2. То что вы загрузили, поместите в структуру HashMap<String, MyDomainModelTextFileRecordName>. Заполняйте её при чтении в п.1, так чтобы ключом сделать, например, группу.

Померяйте производительность ещё раз. Если снова недостаточная, можно сделать
3. второй индекс HashMap<String, HashMap<String, MyDomainModelTextFileRecordName>>, где первый ключ это kind, а второй - че у вас там в первой колонке.

Сколько у вас таких файлов?

1. файл один,
2. загрузке в объект HashMap (здесь понятно)
3. чем и из чего распиливать = this.getClass().getResourceAsStream(resource);

4. "Oracle экземплярами JVM управляет" - т.е. Вы хотите сказать что для сессии возможно единоразово
вызвать класс ресурсов, распилить его в память и прогнать по нему пул записей из 20 тыс. записей.

Верно ли Вас понимаю - так разве возможно ?
...
Рейтинг: 0 / 0
Поиск по ресурсам
    #39265819
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XБолее чем понимаю.....
мне нужна единая JAR библиотека, которая будет вызываться интегрироваться
и вызываться не только из базы., а из под Windows

Я бы всё равно делал на JDBC, и выбирал бы базу из контекста. Если Oracle - читаем из Oracle, если нет, читаем через любую легковесную встроенную БД
...
Рейтинг: 0 / 0
Поиск по ресурсам
    #39265821
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очень странно работать внутри БД и при этом не использовать курсоры и реляционную алгебру.
...
Рейтинг: 0 / 0
25 сообщений из 39, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Поиск по ресурсам
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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