Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Поиск по ресурсам / 25 сообщений из 39, страница 1 из 2
30.06.2016, 13:09
    #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
30.06.2016, 13:17
    #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
30.06.2016, 13:55
    #39265489
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по ресурсам
HOME_X...так как запускается сама функция 15-20 тыс раз
Подскажите нет ли в java типов, механизмов которые осуществили ли мне быструю реализация
создать нормальный тип/класс.

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

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

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


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

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

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


Не понял Вас

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

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

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

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

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

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

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

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

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

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

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

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

Желательно почитать, что значит слово cache. Но тут советовать не берусь, т.к. не знаю Ваши объемы данных, где все это будет исполняться и насколько много разных ресурсов.
...
Рейтинг: 0 / 0
30.06.2016, 17:31
    #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
30.06.2016, 17:32
    #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
30.06.2016, 17:35
    #39265792
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по ресурсам
HOME_X,

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

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


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

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

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

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

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


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


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

Если это "...Хотя бы HashMap...." откуда его грузить ?
...
Рейтинг: 0 / 0
30.06.2016, 17:44
    #39265803
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по ресурсам
HOME_XЕсли это "...Хотя бы HashMap...." откуда его грузить ?
? Из вашего файла.
...
Рейтинг: 0 / 0
30.06.2016, 17:51
    #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
30.06.2016, 17:53
    #39265814
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по ресурсам
HOME_X,

Если у вас файлов много, то добавьте внутри них свой индекс, чтобы не читать каждую строку, а по индексу быстро найти нужный блок файла.
...
Рейтинг: 0 / 0
30.06.2016, 17:54
    #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
30.06.2016, 17:55
    #39265819
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по ресурсам
HOME_XБолее чем понимаю.....
мне нужна единая JAR библиотека, которая будет вызываться интегрироваться
и вызываться не только из базы., а из под Windows

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


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