powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / hibernate и in memory calc
31 сообщений из 31, показаны все 2 страниц
hibernate и in memory calc
    #38902100
hck1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начал изучать java, появился концептуальный вопрос, как лучше организовать с hinernate обработку данных в пямяти ? Задача такая: есть не сильно сложная бд на пару десятков ГБ, хочу попробовать загрузить данные из БД в память и в памяти провести некие расчеты в несколько этапов. первым этапом помечаются объекты для расчета. мой расчет, что данные влезут в мои 16гб. как я понял я могу первым этапом создать List объектов со всеми данными, какие понадобятся. а вот дальше, что ? я могу HQL запросы по созданому List запускать ? другой вариант какой вижу, это настроить второго уровня кеш у хибера и первым этапом я ставлю 1 в переменную тем объектам, какие планирую в дальнейшем обсчитывать. дальше во всех остальных HQL запрсах указывать переменная=1.
подскажите в какую сторону копать ?
...
Рейтинг: 0 / 0
hibernate и in memory calc
    #38902120
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hck1Начал изучать java, появился концептуальный вопрос, как лучше организовать с hinernate обработку данных в пямяти ? Задача такая: есть не сильно сложная бд на пару десятков ГБ, хочу попробовать загрузить данные из БД в память и в памяти провести некие расчеты в несколько этапов. первым этапом помечаются объекты для расчета. мой расчет, что данные влезут в мои 16гб. как я понял я могу первым этапом создать List объектов со всеми данными, какие понадобятся. а вот дальше, что ? я могу HQL запросы по созданому List запускать ? другой вариант какой вижу, это настроить второго уровня кеш у хибера и первым этапом я ставлю 1 в переменную тем объектам, какие планирую в дальнейшем обсчитывать. дальше во всех остальных HQL запрсах указывать переменная=1.
подскажите в какую сторону копать ?

Начнем с того, что это не самая лучшая идея.
Т.е. если есть возможность что-то посчитать в запросе, лучше посчитать в запросе.
А так.
HQL предназначен для выборки данных, т.е. для получения списка объектов-сущностей.
А что дальше вы будете делать с этим списком к hibernate никакого отношения иметь не будет (Если вы не захотите сохранить измененные данные).
...
Рейтинг: 0 / 0
hibernate и in memory calc
    #38902128
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странные измышления. Хибернейт это всего лишь инструмент решающий определенную задачу - загрузку иерархий записей из RDBMS. Почему он вдруг ставиться во главе решения проблемы, мне не понятно.

Для начала нужно определиться ваши вычисления действительно ли так сложны, что в RDBMS их выполнять не эффективно? Или вы закладываетесь на будущую масштабируемость через Map\Reduce на Java?

Если структура БД "не сложная", то я подразумеваю под этим небольшое количество ассоциаций? Какая тогда вообще польза от ORM?
Малое количество ассоциаций, долгоиграющие вычисления, отсутствие нужды в ленивой загрузки - это всё признаки того что ORM для этой задачи не очень-то и нужен.
...
Рейтинг: 0 / 0
hibernate и in memory calc
    #38902181
hck1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по большому счету моя задача проверить вариант обработки данных в памяти, за одно познакомиться с ООП и java. по сути это будет прототип, который покажет перспективность или бесперспективность подхода. в принципе задача уже решена на оракле и с реляционным подходом, работает в проде. задача удачно кладется на реляционную модель, но есть проблемы. сервачек в проде по нынешним меркам слабенький, оракл упирается в ио, выделено ему всего 12гб. бесконечно что-то читает или пишет, если пытаться запустить несколько расчетов параллельно сдыхает ио. кантора гигантская, все забюрократизировано, добавить памяти или ио гигантская проблема.
вобщем в оракле получается, что данные в несколько раз больше места занимают, чем реально нужно для расчета, во первых оракловом блоке много лишнего в заголовке, во вторых для расчета не все поля нужны. в результате для некоторых стран датафайлы 60+ гб и оракл их начинает читать на каждый запрос. я рассчитываю, что объект в памяти замет в 5 раз меньше места и я смогу запустить параллельно несколько расчетов по объектам памяти. сейчас в оракле это приводит к деградации перфоменса, т.к. эти расчеты конкурируют за ио, а все блоки в кеш не влазят.
...
Рейтинг: 0 / 0
hibernate и in memory calc
    #38902189
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hck1,

Такая экономия по памяти это ещё одна причина отказаться от ORM. Используйте любой легковестный маппер SQL на бины.
...
Рейтинг: 0 / 0
hibernate и in memory calc
    #38902198
hck1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
добавлю по задачи. в реляционном оракле реализована так. есть куча стран, от стран приходят данные с изменениями в данных, они накатываются на базу и запускается расчет. расчет для нескольких стран может идти параллельно, это как повезет. для все стран примерно единый алгоритм. из общего массива выбираются объекты какие будут обсчитаны, берется N показателей (для каждой страны свои наборы показателей) и последовательно запускается N SQL запросов (некоторые многоэтажные) которые выдают число. последним этапом эти показатели по каким-то единым формулам для всех стран агригируется и стране высылается файл с результатом. вот проблема с этими SQL запросами, их нельзя запустить в параллель, т.к. они почти все читают большую часть данных и соответственно фулскан делают. ио зашкаливает.
я понимаю, что могу вместо N SQL бегать нафигационно по объектам джава, это будет эффективно но развивать проект задолбаемся. ORM я хочу для того, что эти показатели описывать в HQL, а не многостраничным Java кодом. примерно так мы получаем эти показатели от SaS бизнес аналитиков. плюс есть вариант, что источник данных у нас переместиться в hadoop.
...
Рейтинг: 0 / 0
hibernate и in memory calc
    #38902204
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прям Profit Sharing какой-то :)
...
Рейтинг: 0 / 0
hibernate и in memory calc
    #38902208
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hck1вот проблема с этими SQL запросами, их нельзя запустить в параллель, т.к. они почти все читают большую часть данных и соответственно фулскан делают. ио зашкаливает.
Ну, мысль интересная.

hck1я понимаю, что могу вместо N SQL бегать нафигационно по объектам джава, это будет эффективно но развивать проект задолбаемся.
Эффективность тут сильно зависит от того как именно и как часто по объектам бегать. Может, ведь, оказаться что у оракла были более эффективные индексы.

hck1ORM я хочу для того, что эти показатели описывать в HQL, а не многостраничным Java кодом.

Очень странное желание. HQL транслируется в SQL и на выходе имеем то же самое. HQL не "бегает" по коллекциям объектов.

hck1примерно так мы получаем эти показатели от SaS бизнес аналитиков. плюс есть вариант, что источник данных у нас переместиться в hadoop.
Какие-то слова знакомые, но в голове не укладывается. Какой ещё "источник данных в hadoop"? hadoop то же и есть Map\Reduce о котором я писал выше. Его фишка в том что ваши вычисления на Java вы можете раскидать на кластер и произвести в N раз быстрее чем на одном физическом сервере. Вычисления на SQL так просто не отмасштабировать.
...
Рейтинг: 0 / 0
hibernate и in memory calc
    #38902240
hck1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczЭффективность тут сильно зависит от того как именно и как часто по объектам бегать. Может, ведь, оказаться что у оракла были более эффективные индексы.

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

BlazkowiczОчень странное желание. HQL транслируется в SQL и на выходе имеем то же самое. HQL не "бегает" по коллекциям объектов.

а что такое кеш второго уровня у хибера ? я надеялся, что если объект закешировался в L2, то HQL в базу не пойдет, прочитает из L2.

BlazkowiczКакие-то слова знакомые, но в голове не укладывается. Какой ещё "источник данных в hadoop"? hadoop то же и есть Map\Reduce о котором я писал выше. Его фишка в том что ваши вычисления на Java вы можете раскидать на кластер и произвести в N раз быстрее чем на одном физическом сервере. Вычисления на SQL так просто не отмасштабировать.
на тему hadoop думают другие
я пока map-reduce подходом не проникся, т.к. у меня в моих "показателях" достаточно сложные джоины присутствуют, как я понимаю для hadoop это будет большая проблема. сейчас некоторые страны шлют в hadoop изменения в данных и мы видим, что там пипец как все зависит от структуры. судя по тем проблемам какие они решают, тоже hadoop вариант, но многовато технических вопросов сначала нужно выяснить.
...
Рейтинг: 0 / 0
hibernate и in memory calc
    #38902252
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hck1а что такое кеш второго уровня у хибера ? я надеялся, что если объект закешировался в L2, то HQL в базу не пойдет, прочитает из L2.

Там всё очень запутанно с кешированием. Надо читать актуальный мануал. Может оказаться что запросы, коллекции и единичные сущности кешируются по-разному. И по разному влияют друг на друга. Всё зависит от структуры запросов.
...
Рейтинг: 0 / 0
hibernate и in memory calc
    #38902434
sanBez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hck1вот я не уверен, что индексы идут на пользу именно в такой задачи. каждый показатель читает большую часть таблицы, вычитать таблицу фулсканом без индексов скорее всего эффективней . оракл не знает, что следующий показатель эту же таблицу будет читать и в кеше ее блоки после фулскана не оставляет, ходит по индексам, а потом снова вычитывает эту же таблицу для следующего показателя.

Выделенное жирным - это аццкий отжиг. Админа ораклового вам надо.

hck1и в кеше ее блоки после фулскана не оставляет

Как я понимаю оставляет до тех пор пока есть место и следующее чтение их не перетрет. Если вы хотите всю таблицу загнать в память то и памяти вам надо будет в размере "есть не сильно сложная бд на пару десятков ГБ".

По поводу того что индексы вредят и в таблице много лишних полей. Если в select выбираются только поля индекса, оракл в таблицу вообще не лезет, а берет все данные из индекса. Размер заголовка таблицы в этом случае пофиг.

hck1а потом снова вычитывает эту же таблицу для следующего показателя.

изменить алгоритм расчета. Чтобы два показателя считались за один проход. Как один из вариантов.
Вообще то мне кажется прежде чем переделывать на java большие вычисления нужно понять что именно тормозит и как это будет лучше обсчитать в java. Уже с прикидкой алгоритмов. Не просто перевод PL/SQL -> java один в один. Иначе есть шанс что к тому же приплывете
...
Рейтинг: 0 / 0
hibernate и in memory calc
    #38902444
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sanBez,

Полностью соглашусь с каждым комментарием. Интересно, можно ли в Oracle загнать какую-нибудь жирную выборку целиком в память и потом запустить алгоритм только по ней?
...
Рейтинг: 0 / 0
hibernate и in memory calc
    #38902459
sanBez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczИнтересно, можно ли в Oracle загнать какую-нибудь жирную выборку целиком в память и потом запустить алгоритм только по ней?
Выборку можно целиком загнать в таблицу в памяти. Есть там какие-то. Точно не скажу, я только правил чуть алгоритм расчета до меня написанный. Давно это было. Вот там работа шла по этим таблицам.
...
Рейтинг: 0 / 0
hibernate и in memory calc
    #38902461
hck1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sanBezhck1вот я не уверен, что индексы идут на пользу именно в такой задачи. каждый показатель читает большую часть таблицы, вычитать таблицу фулсканом без индексов скорее всего эффективней . оракл не знает, что следующий показатель эту же таблицу будет читать и в кеше ее блоки после фулскана не оставляет, ходит по индексам, а потом снова вычитывает эту же таблицу для следующего показателя.

Выделенное жирным - это аццкий отжиг. Админа ораклового вам надо.

почитайте что-нибудь о многоблочном чтении (scattered read). взрослые субд применяют почти всегда применяют фулскан если нужно более четверти блоков таблицы.

sanBezhck1и в кеше ее блоки после фулскана не оставляет

Как я понимаю оставляет до тех пор пока есть место и следующее чтение их не перетрет.

не верно понимаете, взрослые субд при фулскане не вымывают кеш, он идет мимо и кеша файловой системы и мимо кеша субд.

sanBezизменить алгоритм расчета. Чтобы два показателя считались за один проход. Как один из вариантов.

не уверен, что это хороший вариант. к этим показателям постоянно приходят изменения требований, вроде изначально простенький SQL начинает обрастать вложенностями, аналитическими функциями и т.п.. вобщем просто с точки зрения поддержки решено показатели не смешивать, т.к. никто не знает куда они потом разовьются.

sanBezВообще то мне кажется прежде чем переделывать на java большие вычисления нужно понять что именно тормозит и как это будет лучше обсчитать в java.
тут понимание то есть, нет особо идей как с этим бороться имея 12гб RAM. нужно запускать расчет показателей одновременно в параллель, но в оракле из-за не самой оптимальной структуры блока просто выливается в конкуренцию за ио. а вот на объекте в памяти есть шанс, что конкуренции не будет. все ядра CPU будут заняты пробежками по объекту, о не ожиданиями ио
...
Рейтинг: 0 / 0
hibernate и in memory calc
    #38902475
hck1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz Интересно, можно ли в Oracle загнать какую-нибудь жирную выборку целиком в память и потом запустить алгоритм только по ней?
можно наделать индексов и загнать их в keep pool, захинтовать запросы так, что бы они брали данные только из указанных индексов. но звучит как изврат
...
Рейтинг: 0 / 0
hibernate и in memory calc
    #38902515
sanBez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ох, неохота спорить, да и не админ я,но 5 копеек вставлю ))

hck1почитайте что-нибудь о многоблочном чтении (scattered read). взрослые субд применяют почти всегда применяют фулскан если нужно более четверти блоков таблицы.


Есть хинты. Хотите без индексов ставьте соответствующий хинт, будет фуллскан. Хотя спорить с ораклом. Оптимизатор у него вууумный. И обычно если он выбирает нужный план, то считает его оптимальным. Статистика по таблицам влиять может. Но это опять вопрос к админу.

hck1не верно понимаете, взрослые субд при фулскане не вымывают кеш, он идет мимо и кеша файловой системы и мимо кеша субд.

Куда он идет то? :) Ну пусть он не называется кэш, но область то в памяти есть

sanBezизменить алгоритм расчета. Чтобы два показателя считались за один проход. Как один из вариантов.

hck1не уверен, что это хороший вариант. к этим показателям постоянно приходят изменения требований, вроде изначально простенький SQL начинает обрастать вложенностями, аналитическими функциями и т.п.. вобщем просто с точки зрения поддержки решено показатели не смешивать, т.к. никто не знает куда они потом разовьются.

Я разве предлагал смешивать показатели?

hck1тут понимание то есть, нет особо идей как с этим бороться имея 12гб RAM. нужно запускать расчет показателей одновременно в параллель, но в оракле из-за не самой оптимальной структуры блока просто выливается в конкуренцию за ио. а вот на объекте в памяти есть шанс, что конкуренции не будет. все ядра CPU будут заняты пробежками по объекту, о не ожиданиями ио

Да не, задача то конечно интересная. Но "есть шанс" смущает как то.

З.Ы.
Было как-то дело оптимизил расчет. Пытался отказаться от процедур на PL/SQL в пользу java. Выигрыша не получил. Обсчет то сам быстрее намного был, но насколько помню сам процесс преобразования "строка таблицы СУБД"->"объект java" + сетевой траффик (поднималорсь много коротких записей) привели к затратам несопоставимым с затратами на PL/SQL. И вернул назад чисто все на базу. Делалось давно, деталей не помню. Но с тех пор к фразе "на java явно будет быстрее" отношусь настороженно. :)

Удачи.
...
Рейтинг: 0 / 0
hibernate и in memory calc
    #38903110
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что то мне подсказывает, что затея какая то сомнительная, сомневаюсь, что вообще даст эффект.

Имхо, варианты следующие:
1. Попытаться по крутить структуру БД (саму структуру таблиц, партиции, индексы), подкрутить настройки использования памяти и все будет хорошо.
2. Если очень хочется, то Oracle 12 умеет in-memory. Указываете какие колонки/таблицы/партиции должны быть in-memory, и они сразу же прелоадятся при старте, причем хранятся column store формате со сжатием. Итого, если уверены, что все что вам нужно залезает в ваши 12Гб, то грамотно настраиваете, чтобы нужные данные были in-memory и радуетесь.
...
Рейтинг: 0 / 0
hibernate и in memory calc
    #38903215
hck1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
just_vladimir2. Если очень хочется, то Oracle 12 умеет in-memory. Указываете какие колонки/таблицы/партиции должны быть in-memory, и они сразу же прелоадятся при старте, причем хранятся column store формате со сжатием. Итого, если уверены, что все что вам нужно залезает в ваши 12Гб, то грамотно настраиваете, чтобы нужные данные были in-memory и радуетесь.
да, column store и in-memory то что доктор прописал, но это ЕЕ фичи, да еще и отдельно лицензируются. у нас SE и желание вообще от оракла отказаться.

у меня такой вопрос созрел, а что такое JPQL ? его запросы нельзя на свои объекты запускать ?
...
Рейтинг: 0 / 0
hibernate и in memory calc
    #38903386
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hck1just_vladimir2. Если очень хочется, то Oracle 12 умеет in-memory. Указываете какие колонки/таблицы/партиции должны быть in-memory, и они сразу же прелоадятся при старте, причем хранятся column store формате со сжатием. Итого, если уверены, что все что вам нужно залезает в ваши 12Гб, то грамотно настраиваете, чтобы нужные данные были in-memory и радуетесь.
да, column store и in-memory то что доктор прописал, но это ЕЕ фичи, да еще и отдельно лицензируются. у нас SE и желание вообще от оракла отказаться.

у меня такой вопрос созрел, а что такое JPQL ? его запросы нельзя на свои объекты запускать ?

Подожди. Ты вообще не там ищешь решение.

Итак. Есть некий набор таблиц.
Для расчёта надо (как я понял) перебрать небольшое число колонок большого числа строк.
Нужно получить несколько результатов, каждый из которых читает почти все данные, но расчёт запускается независимо.
Расчёт написан на pl/sql и sql.
Как результат- запросы напрягают диск.
Ты хочешь перенести данные из БД в память, но при этом обращаться к ним с SQL-подобным языком, чтобы не переписывать алгоритм.

Я правильно понял?

Если так, то явно pl/sql код написан нехорошо.
Например- на вход надо подавать не одну страну, а набор (временную таблицу, коллекцию) и результат выдавать так же.
В общем- тут, скорее всего, случай, когда делается ненужная попытка отказаться от sql.
...
Рейтинг: 0 / 0
hibernate и in memory calc
    #38903467
hck1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominПодожди. Ты вообще не там ищешь решение.

Итак. Есть некий набор таблиц.
Для расчёта надо (как я понял) перебрать небольшое число колонок большого числа строк.
Нужно получить несколько результатов, каждый из которых читает почти все данные, но расчёт запускается независимо.
Расчёт написан на pl/sql и sql.
Как результат- запросы напрягают диск.
Ты хочешь перенести данные из БД в память, но при этом обращаться к ним с SQL-подобным языком, чтобы не переписывать алгоритм.

Я правильно понял?

да, все верно, только SQL подобный я хочу скорее для компактности и наглядности, т.к. по сути там вся логика задачи и есть, там все ошибки будут. ну кроме этого бизнес аналитики в SaS примерно таким языком выдают requirements.

Alexey TominЕсли так, то явно pl/sql код написан нехорошо.
Например- на вход надо подавать не одну страну, а набор (временную таблицу, коллекцию) и результат выдавать так же.
В общем- тут, скорее всего, случай, когда делается ненужная попытка отказаться от sql.
поверьте, у меня неплохой опыт и знания оракла, да там есть варианты какие можно попробывать, но у меня даже не задача а хотелка прощупать in-memory вариант. пока у меня план засосать данные в объект и попробывать просто вместо показателей считать байты каких-то полей. наверно я получу близкие цифры расчета с реальными показателями.

P.S. у каждой страны свой набор данных (даже таблеспейс) и свой набор показателей, обрабатываются страны независимо, часто параллельно.
...
Рейтинг: 0 / 0
hibernate и in memory calc
    #38903507
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hck1да, все верно, только SQL подобный я хочу скорее для компактности и наглядности, т.к. по сути там вся логика задачи и есть, там все ошибки будут. ну кроме этого бизнес аналитики в SaS примерно таким языком выдают requirements.
...
поверьте, у меня неплохой опыт и знания оракла, да там есть варианты какие можно попробывать, но у меня даже не задача а хотелка прощупать in-memory вариант.

Тогда не надо упираться в SQL-подобный синтаксис.
Загружаются данные, кладутся в объекты, для поиска- HashMap.

hck1P.S. у каждой страны свой набор данных (даже таблеспейс) и свой набор показателей, обрабатываются страны независимо, часто параллельно.

А как тогда уменьшить IO? Для каждого расчёта нужно будет загрузить те же данные, только не в память сервера, а в память расчётной машины.
...
Рейтинг: 0 / 0
hibernate и in memory calc
    #38903645
hck1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominТогда не надо упираться в SQL-подобный синтаксис.
Загружаются данные, кладутся в объекты, для поиска- HashMap.

почитал по хешмап, но не понял как оно поможет в поиске. например есть показатель посчитать кол-во записей из table1, которые имеют дату в пределах 365 дней от некого события. "события" это table2.
по синтаксису смущает, что pure java код будет длинным и не столь наглядным как декларативный аля SQL. но это на данном этапе не столь принципиально.

Alexey TominА как тогда уменьшить IO? Для каждого расчёта нужно будет загрузить те же данные, только не в память сервера, а в память расчётной машины.
сейчас выходит, что 3-4 страны могут прислать свои файлы примерно в одно время и долбят запросами показателей оракл одновременно, каждая свой набор таблиц, от 2 до 6 часов. если страны выстраивать по очереди, выходит еще дольше. я же хочу проверить вариант выстроить в очередь, загрузить все в память. 60 гб сырых данных поднять с дисков думаю реально минут за несколько минут, ну допустим, 10-15 минут еще на конвертацию в джава типы. но дальше я расчитываю все показатели (10-20 штук) запустить одновременно, загрузив полностью все ядра. в теории их никакие ожидания не должны тормозить. за какое время можно обойти весь объект, гигов в 16 ? ведь наверника не часы.
...
Рейтинг: 0 / 0
hibernate и in memory calc
    #38903834
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hck1Alexey TominТогда не надо упираться в SQL-подобный синтаксис.
Загружаются данные, кладутся в объекты, для поиска- HashMap.

почитал по хешмап, но не понял как оно поможет в поиске. например есть показатель посчитать кол-во записей из table1, которые имеют дату в пределах 365 дней от некого события.

Map'ы это "индекс с поиском по совпадению".
По диапазону- это сортированный List<Pair<Date, Element>>

hck1по синтаксису смущает, что pure java код будет длинным и не столь наглядным как декларативный аля SQL. но это на данном этапе не столь принципиально.

SQL не дураки придумали- у несго своя область применения.

hck1Alexey TominА как тогда уменьшить IO? Для каждого расчёта нужно будет загрузить те же данные, только не в память сервера, а в память расчётной машины.
сейчас выходит, что 3-4 страны могут прислать свои файлы примерно в одно время и долбят запросами показателей оракл одновременно, каждая свой набор таблиц, от 2 до 6 часов. если страны выстраивать по очереди, выходит еще дольше. я же хочу проверить вариант выстроить в очередь, загрузить все в память. 60 гб сырых данных поднять с дисков думаю реально минут за несколько минут, ну допустим, 10-15 минут еще на конвертацию в джава типы. но дальше я расчитываю все показатели (10-20 штук) запустить одновременно, загрузив полностью все ядра. в теории их никакие ожидания не должны тормозить. за какое время можно обойти весь объект, гигов в 16 ? ведь наверника не часы.

Не сходится.
Если из 2..6 часов чтение с диска занимает 10-15 минут, то что делает сервер остальное время?
Если памяти мало, то выставление задач в очередь должно помочь.
...
Рейтинг: 0 / 0
hibernate и in memory calc
    #38903837
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominПо диапазону- это сортированный List<Pair<Date, Element>>

Тьфу! Деревья, конечно.
...
Рейтинг: 0 / 0
hibernate и in memory calc
    #38903919
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominНе сходится.
Если из 2..6 часов чтение с диска занимает 10-15 минут, то что делает сервер остальное время?
....
sanBez...это аццкий отжиг. Админа ораклового вам надо...
поддерживаю sanBez. Запускать реальный код, смотреть на чем тормозит, _те_куски_ которые тормозят и оптимизировать.
...
Рейтинг: 0 / 0
hibernate и in memory calc
    #38903980
hck1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevAlexey TominНе сходится.
Если из 2..6 часов чтение с диска занимает 10-15 минут, то что делает сервер остальное время?
....
sanBez...это аццкий отжиг. Админа ораклового вам надо...
поддерживаю sanBez. Запускать реальный код, смотреть на чем тормозит, _те_куски_ которые тормозят и оптимизировать.

я же вроде подробно разложил? в чем проблема. у оракла своя сфера применения, я лучше чем кто-либо другой эту сферу знаю. проблема в том, что для такой задачи не нужен оракл. задачи не нужна его сложная структура блока, которая резервирует место на заголовок, блокировки и прочую дребедень. задачи не нужен навороченный оракловый оптимизатор, не нужно построчное хранение. почти ничего в чем силен оракл не нужно. я уже написал один раз, повторюсь, оптимизатор оракла применяет fullscan если запросу необходимо более 25% блоков и блоков нет в кеше. выходит, что показатель1 читает таблицу, показатель2 читает другую, вытесняет блоки первой, потом показатель3 снова вынужден читать с диска таблицу1. что и почему понятно. оптимизировать можно, можно увеличить размер блока, уменьшить кол-во слотов в блоке, расставить близкие показатели друг за другом. да этим наверно займемся, но сюда я пришел с другой задачей. у меня задача посмотреть на in-memory вариант и прокачать джава скилы. давайте на джава сосредоточимся.
...
Рейтинг: 0 / 0
hibernate и in memory calc
    #38904038
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hck1я же вроде подробно разложил? в чем проблема. у оракла своя сфера применения, я лучше чем кто-либо другой эту сферу знаю.

Весьма смелое заявление.

hck1я уже написал один раз, повторюсь, оптимизатор оракла применяет fullscan если запросу необходимо более 25% блоков и блоков нет в кеше. выходит, что показатель1 читает таблицу, показатель2 читает другую, вытесняет блоки первой, потом показатель3 снова вынужден читать с диска таблицу1

Стоп. Если стран много (я так понял, больше десятка), а данные разных стран лежат в разных партициях, то не может быть, чтобы ради каждой страны поднималось более 25% строк таблицы.

hck1но сюда я пришел с другой задачей. у меня задача посмотреть на in-memory вариант и прокачать джава скилы. давайте на джава сосредоточимся.

Надо понимать, что никто не пришёл сюда ради помощи hck1. Кто-то мозги чешет интересными задачками, кто-то своё самолюбие.
Так что на чём бы Вы не хотели сосредоточится- я всё одно не понимаю, почему вдруг java тут сильно ускорит дело...
...
Рейтинг: 0 / 0
hibernate и in memory calc
    #38904080
hck1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominСтоп. Если стран много (я так понял, больше десятка), а данные разных стран лежат в разных партициях, то не может быть, чтобы ради каждой страны поднималось более 25% строк таблицы.
у SE редакции нет партиций. данные стран лежат в разных схемах и даже в разных таблеспейсах, я об этом упоминал тут
hck1P.S. у каждой страны свой набор данных (даже таблеспейс) и свой набор показателей, обрабатываются страны независимо, часто параллельно.
у стран схожи 70% таблиц, но не идентичны. где-то чуть шире таблички, где-то чуть меньше полей. размер полей у стран может быть разным.
...
Рейтинг: 0 / 0
hibernate и in memory calc
    #38904225
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hck1Alexey TominСтоп. Если стран много (я так понял, больше десятка), а данные разных стран лежат в разных партициях, то не может быть, чтобы ради каждой страны поднималось более 25% строк таблицы.
у SE редакции нет партиций. данные стран лежат в разных схемах и даже в разных таблеспейсах, я об этом упоминал тут
hck1P.S. у каждой страны свой набор данных (даже таблеспейс) и свой набор показателей, обрабатываются страны независимо, часто параллельно.
у стран схожи 70% таблиц, но не идентичны. где-то чуть шире таблички, где-то чуть меньше полей. размер полей у стран может быть разным.

Но при этом
hck1выходит, что показатель1 читает таблицу, показатель2 читает другую, вытесняет блоки первой, потом показатель3 снова вынужден читать с диска таблицу1

А! Понял. Страны-то разные, но "показатели" читают одно и то же.
Тогда sql должен читать таблицу1 и собирать его сразу в несколько агрегатов.
Скорее всего в готовые показатели это не соберётся, но это не беда- собрать во временную таблицу (небольшую) и из неё- в показатели.
...
Рейтинг: 0 / 0
hibernate и in memory calc
    #38939837
hck1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, что-то мои расчеты на компактность объектов жава в сравнению с субд совсем не оправдываются. я сгенерил с помощью NetBeans классы из базы данных для хибера. заменил LAZY на EAGER, запустил с такими параметрами -XX:MaxHeapSize=11g -XX:PermSize=256m. вылетело так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at org.hibernate.internal.util.collections.IdentityMap.entryArray(IdentityMap.java:164)
        at org.hibernate.internal.util.collections.IdentityMap.concurrentEntries(IdentityMap.java:75)
        at org.hibernate.engine.internal.StatefulPersistenceContext.clear(StatefulPersistenceContext.java:237)
        at org.hibernate.internal.SessionImpl.cleanup(SessionImpl.java:598)
        at org.hibernate.internal.SessionImpl.close(SessionImpl.java:379)
        at com.testcompany.testPROG.main(testPROG.java:91)
погуглил, добавил еще такой -XX:-UseGCOverheadLimit, начало работать дольше, но вылетает так же. тогда решил посмотреть сколько удалось запихнуть. поставил println и вернул LAZY в хибернейту. вылетает где-то на 250к объектах, при том, что я хотел в 11гб запихнуть 6 млн, т.к. в оракле эти данные 10гб занимают. кроме этого процесс идет чудовищно медленно, часы

Код: 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.
public class testPRG {
   private static SessionFactory factory; 
   public static void main(String[] args) {
      BigDecimal myAmount=new BigDecimal("0"); 
      int i = 0;
      try{
         factory = new AnnotationConfiguration().
                   configure().
                   //addPackage("com.xyz") //add package if used.
                   addAnnotatedClass(Customers.class).
                   buildSessionFactory();
      }catch (Throwable ex) { 
         System.err.println("Failed to create sessionFactory object." + ex);
         throw new ExceptionInInitializerError(ex); 
      }
      // Customers cust = new Customers();
      Date dNow = new Date( );
      SimpleDateFormat ft = 
      new SimpleDateFormat ("E yyyy.MM.dd 'at' hh:mm:ss a zzz");
      System.out.println("Current Date: " + ft.format(dNow));

      System.out.println("Started!");
      
      Session session = factory.openSession();
      Transaction tx = null;
      try{
         tx = session.beginTransaction();
         List cust_array = session.createQuery("FROM Customers").list(); 
         for (Iterator iterator = 
                           cust_array.iterator(); iterator.hasNext();){
            Customers cust = (Customers) iterator.next(); 
            i++ ;
            dNow = new Date( );
               
            if (i % 1000 == 0 ) {
              System.out.println("Row "+i+" "+ ft.format(dNow));
            }        
            
            Set<CaseCustomers> cacuList = cust.getCaseCustomerses() ;
            
            for (Iterator iterator2 = 
                              cacuList.iterator(); iterator2.hasNext();){
               CaseCustomers cacu = (CaseCustomers) iterator2.next(); 
               Set<Bookings> bookList = cacu.getBookingses() ;
                for (Iterator iterator3 = 
                                  bookList.iterator(); iterator3.hasNext();){
                   Bookings book = (Bookings) iterator3.next(); 
                   myAmount = myAmount.add(book.getAmount());
                }
            
            }      
         }
         // tx.commit();
         System.out.println("Total book Amount: " + myAmount.setScale(2).toPlainString());
         
         Date dNow2 = new Date( );
         System.out.println("Job finished: " + ft.format(dNow2));
      }catch (HibernateException e) {
         if (tx!=null) tx.rollback();
         e.printStackTrace(); 
      }finally {
         session.close(); 
      }
   }



запускал профайлер от NetBeans, выглядит что вся проблема в том, что ресурсы уходят на работу GC.
сейчас попробовал отключить L2 кеш у хибера, подозреваю если и поможет, то не принципиально. может я что-то делаю принципиально не так ?
и второй вопрос, я верно понимаю, что с EAGER хибернейт не будет долбить в цикле запросы, как это я наблюдаю с LAZY. будет один большой запрос или так и продолжит долбить в цикле на каждого Customer запросом для Bookings ?
...
Рейтинг: 0 / 0
hibernate и in memory calc
    #38940007
hck1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
наверно я понял почему мой фокус не удался. java ведь при инициализации объекта резервирует память на тот размер, какой продефинирован в классе, а в оракле данные хранятся более компактно. если в оракловом Number(12) храниться 0, то это всего 2 байта на диске, в то время как в Java объекте у меня заняло 32-бит (BigDecimal).
...
Рейтинг: 0 / 0
31 сообщений из 31, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / hibernate и in memory calc
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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