|
|
|
Java performance & GC
|
|||
|---|---|---|---|
|
#18+
Большой Синий КитPetro123Большой Синий Кит, а почему БД не подходит: - сливаем сырые данные - в фоне достаём - обработал - положил ? Почему не подходит? Подходит, согласен. Просто тут ведь нет в исходных данных БД... Есть сходные задачи: 5000 датчиков льют данные. Их надо обработать. - пишем быстро - не торопясь обрабатываем. Главное что статистика не оперирует сразу ВСЕМИ - тогда можно в ОРМ - если сразу всеми, тогда SQL операторы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2012, 17:07:22 |
|
||
|
Java performance & GC
|
|||
|---|---|---|---|
|
#18+
просто у БД память GC не кончается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2012, 17:08:19 |
|
||
|
Java performance & GC
|
|||
|---|---|---|---|
|
#18+
Petro123, :) Согласен ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2012, 17:09:40 |
|
||
|
Java performance & GC
|
|||
|---|---|---|---|
|
#18+
ОзверинДлина строки сильно варьироваться может. Условно мы говорим о 1500 символах в строке. (примерно такой порядок) Насчет кол-ва сущностей, очень трудно сказать. 1 уникальный ключ на строку - может быть >1 уникального ключа на строку - тоже(работаю с логом стороннего разработчика, за что купил, как говорится) <1 уникального ключа на строку - если она будет агрегирована с предыдущими строками Теперь я озадачен, чуть более чем полностью. Имеем 4Гб упакованый файл (zip). Можно предположить что после распаковки там 6-8Гиг. Не меньше. Теперь это всё надо считать в кучу 1.2Гб, так чтобы оно туда поместилось. Так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2012, 17:10:47 |
|
||
|
Java performance & GC
|
|||
|---|---|---|---|
|
#18+
BlazkowiczОзверинДлина строки сильно варьироваться может. Условно мы говорим о 1500 символах в строке. (примерно такой порядок) Насчет кол-ва сущностей, очень трудно сказать. 1 уникальный ключ на строку - может быть >1 уникального ключа на строку - тоже(работаю с логом стороннего разработчика, за что купил, как говорится) <1 уникального ключа на строку - если она будет агрегирована с предыдущими строками Теперь я озадачен, чуть более чем полностью. Имеем 4Гб упакованый файл (zip). Можно предположить что после распаковки там 6-8Гиг. Не меньше. Теперь это всё надо считать в кучу 1.2Гб, так чтобы оно туда поместилось. Так? да, но хранение данных на винте и в памяти - разные вещи. В java достаточно эффективно организовано хранение символьных данных. Я не спорю, что 1200 вполне вероятно, что мало. Но есть подозрение, что может и хватить. Подозрение основано на том, что еще недавно хватало ;) Я пока ищу, что такого я изменил, что перестало...по сути - добавил несколько полей в сущность.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2012, 17:24:50 |
|
||
|
Java performance & GC
|
|||
|---|---|---|---|
|
#18+
BlazkowiczТеперь я озадачен, чуть более чем полностью. Имеем 4Гб упакованый файл (zip). Можно предположить что после распаковки там 6-8Гиг. Не меньше. Теперь это всё надо считать в кучу 1.2Гб, так чтобы оно туда поместилось. Так?Не совсем. Если отсортировать распакованный поток, то возможны варианты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2012, 17:45:08 |
|
||
|
Java performance & GC
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovНе совсем. Если отсортировать распакованный поток, то возможны варианты. У автора одна строка - одна сущность. И сколько сущностей он не знает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2012, 17:48:20 |
|
||
|
Java performance & GC
|
|||
|---|---|---|---|
|
#18+
ОзверинПодозрение основано на том, что еще недавно хватало ;) Я пока ищу, что такого я изменил, что перестало...по сути - добавил несколько полей в сущность.... А можно вернуть обратно и посмотреть график расхода кучи в jvisualvm? Может было на пределе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2012, 17:49:03 |
|
||
|
Java performance & GC
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, правы были, филды сущности String с сылкой на char[] c изначальной строки с offset. Короче все 27 миллионов строк в памяти в итоге висят...где то я косячу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2012, 17:50:10 |
|
||
|
Java performance & GC
|
|||
|---|---|---|---|
|
#18+
BlazkowiczИ сколько сущностей он не знает.В своё время "за ненахождением готового" клепал на коленке "отчёты по трафику". Читались логи TMeter-а, разбирались в sort-ready вид и конвейер "rexx скрипт1|sort|rexx скрипт2 > результат.tsv" выдавал данные для Excel-я. Сколько будет строк на входе - известно только по порядку величины (сотни тысяч-миллионы - скриптец "информировал" в прогресс-столбце :)), а на выходе их должно было стать не более 50-60 тысяч. Становилось. Гарантированно :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2012, 18:01:03 |
|
||
|
Java performance & GC
|
|||
|---|---|---|---|
|
#18+
Первоначальный итог? задачу создавал в тестовом своем проекте, запускал с ключом -XX:+UseCompressedStrings. Когда код перенес в рабочий, ключ забыл. А он реально помогает ;) Вторичная проблема String[] values = line.parse(); Когда мы делаем нечто вроде entity.setColumn1(values[1]); entity.setColumn2(values[2]); entity.setColumn3(values[3]); map.put(entity); то. column1, column2, column3 ссылаются на 1 и тот же массив символов , но каждый со своим смещением, то есть они держат строку в памяти, не давая GC ее подчистить. А сам объект в мапе. Вывод, при условии, что изначально line очень прилично длины, при setColumn копировать не ссылке, а по значению ;) Должно помочь.буду проверять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2012, 18:25:48 |
|
||
|
Java performance & GC
|
|||
|---|---|---|---|
|
#18+
ОзверинBlazkowicz, правы были, филды сущности String с сылкой на char[] c изначальной строки с offset. Короче все 27 миллионов строк в памяти в итоге висят...где то я косячу. оффтоп Blazkowicz обычно всегда как в воду глядит. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2012, 22:57:55 |
|
||
|
Java performance & GC
|
|||
|---|---|---|---|
|
#18+
P.S. Кстати говоря, можно поглядеть на метод String.intern() - для вычитываемой строки :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2012, 22:59:10 |
|
||
|
Java performance & GC
|
|||
|---|---|---|---|
|
#18+
Однако, ИМХО мапредьюс или СУБД для слива данных решение гораздо лучшее. С помощью СУБД проще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2012, 23:01:18 |
|
||
|
Java performance & GC
|
|||
|---|---|---|---|
|
#18+
Не, про интерн() лучше, пожалуй, забыть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2012, 23:23:11 |
|
||
|
Java performance & GC
|
|||
|---|---|---|---|
|
#18+
ОзверинПо сути myEntity - это одна строка. String[] values myEntity.setColumn0(values[0]); myEntity.setColumn1(values[1]); myEntity.setColumn2(values[2]); myEntity.setColumnN(values[N]); Но. Для примера ключ1, поле1=1, поле2=10 ключ1, поле1=2, поле2=10 ключ1, поле1=5, поле2=15 если у строк ключ совпадает, то мы просто в 1ой сущности суммируем поле1 и поле2, т.е. не факт, что каждая новая строка создат и кинет в кэш новую сущностьНаверное самым эффективным будет применение СУБД в том или ином виде. Ваша структура ложится на реляционную модель довольно просто. Таблица для ключей, таблица для полей и таблица значений. Банальный EAV. При работу с СУБД вам даже в памяти не нужно держать мапы сущьностей - ищите по ключу в БД. Если есть, то обновляете, иначе заливаете новую. Если начальство на отрез не хочет полноценную СУБД - примените in-memory БД, которая при нехватке памяти скидывает данные на винт. Тогда даже при увеличении исходных данных в 10-ть! раз система будет работоспособной PS при системе с БД ваш код даже не придется сильно исправлять. поскольку нет мапов, то строки сущностей не хранятся в памяти, а значит и объекты создаваемые в текущем коде будет нормально обрабатываться GC. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2012, 00:43:00 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37663485&tid=2132555]: |
0ms |
get settings: |
14ms |
get forum list: |
25ms |
check forum access: |
8ms |
check topic access: |
8ms |
track hit: |
68ms |
get topic data: |
24ms |
get forum data: |
6ms |
get page messages: |
117ms |
get tp. blocked users: |
2ms |
| others: | 393ms |
| total: | 665ms |

| 0 / 0 |
