Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Java performance & GC / 25 сообщений из 42, страница 1 из 2
15.02.2012, 16:11:12
    #37663267
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java performance & GC
Сижу- борюсь с outOfMemory. Диагноз стандартный char[].
Суть задачи - распарс текстового файла. Каждая строка храниться в HashMap(строка маппится по полям на экземпляр класс сущности некой). Сам файл huge!!!(боле нескольки гигов в gz)

Последовательность примерно такая:

readLine->parseLine->entityMapper->entityToCache.

Кроме кэша все переменные - локальные.

Читаю разнообразные GC типсы..но судя по всему - они по факту бесполезны.
1. Кто как эффективно боролся?:)
2. System.arraycopy(src, 0, dst, 0, src.length) - может ли подобная операция(над каждой строкой выполняется) привести к подобным последствия?
...
Рейтинг: 0 / 0
15.02.2012, 16:16:03
    #37663278
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java performance & GC
ОзверинСуть задачи - распарс текстового файла. Каждая строка храниться в HashMap(строка маппится по полям на экземпляр класс сущности некой). Сам файл huge!!!(боле нескольки гигов в gz)

Давайте не углублятся в детали, а просто логически подумаем. Есть текстовый файл в несколько гигов. Его нужно распарсить в более сложную структуру. Соответственно новая структура легко занимает 3-4 гига. При чем здесь тогда вообще GC? Что именно нужно сделать с этим объемом данных?
...
Рейтинг: 0 / 0
15.02.2012, 16:20:44
    #37663288
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java performance & GC
BlazkowiczОзверинСуть задачи - распарс текстового файла. Каждая строка храниться в HashMap(строка маппится по полям на экземпляр класс сущности некой). Сам файл huge!!!(боле нескольки гигов в gz)

Давайте не углублятся в детали, а просто логически подумаем. Есть текстовый файл в несколько гигов. Его нужно распарсить в более сложную структуру. Соответственно новая структура легко занимает 3-4 гига. При чем здесь тогда вообще GC? Что именно нужно сделать с этим объемом данных?

я это понимаю.

Каждая строка содержит ключ, по которому нужно агрегировать данные, т.е весь объем данных нужен, чтобы вычислить некие величины. Если НЕ брать в расчет возможность хранения "временных" данных в бд, то есть ли tips для подобных задач?;)
...
Рейтинг: 0 / 0
15.02.2012, 16:23:11
    #37663296
Leonidv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java performance & GC
Озверин,

mapreduce.
...
Рейтинг: 0 / 0
15.02.2012, 16:24:28
    #37663301
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java performance & GC
Озвериня это понимаю.
А я нет. Какая конечная цель? Какой результат парсинга? Что на выходе?

ОзверинКаждая строка содержит ключ, по которому нужно агрегировать данные, т.е весь объем данных нужен, чтобы вычислить некие величины. Если НЕ брать в расчет возможность хранения "временных" данных в бд, то есть ли tips для подобных задач?;)
Нужно типа статистику посчитать по всем данным? Надо от задачи отталкиваться. Почему вы решили что OutOfMemoryError связан с работой GC, а не с банальной нехваткой памяти?
...
Рейтинг: 0 / 0
15.02.2012, 16:25:36
    #37663308
Leonidv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java performance & GC
Либо хранить в ehcache и разрешить ему записывать данные на диск. Еще, похоже, есть вариант память перед CPU. Если задача позволяет, можно делать так. Находим первый ключ, обрабатываем все строки, для которых он нужен. Запоминаем его и находим второй ключ. И т.д. Минус в том, что файл будет прочитан столько раз, сколько у вас ключей. Плюс в том, что если ключей много, то нагрузка на память будет существенно меньше.
...
Рейтинг: 0 / 0
15.02.2012, 16:29:59
    #37663317
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java performance & GC
BlazkowiczОзвериня это понимаю.
А я нет. Какая конечная цель? Какой результат парсинга? Что на выходе?

ОзверинКаждая строка содержит ключ, по которому нужно агрегировать данные, т.е весь объем данных нужен, чтобы вычислить некие величины. Если НЕ брать в расчет возможность хранения "временных" данных в бд, то есть ли tips для подобных задач?;)
Нужно типа статистику посчитать по всем данным? Надо от задачи отталкиваться. Почему вы решили что OutOfMemoryError связан с работой GC, а не с банальной нехваткой памяти?

На выходе - расчет статистики.

1. задача - это расчет статистики
2. задача - баланс между выделения памяти под heap size, т.е - чем меньше, тем лучше ;) На данный момент я под задачу выделил 1200m.

Над каждой строкой примерно следующие операции выполняются:
String readLine()
String[] parse(String line)
MyEntity createEntity(String[] line)

//логика примерно такая, если объект по ключу уже есть в кэше, расчитываем некие величиные его полей, если нет - в мапу кидаем просто)
void cacheMyEntity()->hashMap
void groupMyEntity()-hashMap
...
Рейтинг: 0 / 0
15.02.2012, 16:32:42
    #37663331
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java performance & GC
LeonidvЛибо хранить в ehcache и разрешить ему записывать данные на диск. Еще, похоже, есть вариант память перед CPU. Если задача позволяет, можно делать так. Находим первый ключ, обрабатываем все строки, для которых он нужен. Запоминаем его и находим второй ключ. И т.д. Минус в том, что файл будет прочитан столько раз, сколько у вас ключей. Плюс в том, что если ключей много, то нагрузка на память будет существенно меньше.

Файл в запакованном виде 4 гига. Боюсь соврать, там вроде 27 миллионов записей.
...
Рейтинг: 0 / 0
15.02.2012, 16:32:55
    #37663332
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java performance & GC
Озверин,
колись и не стесняйся лохануться. Просто нужен свежий взгляд.
95 процентов всех причин - простые (с - статистика авиапроисшествий).
...
Рейтинг: 0 / 0
15.02.2012, 16:34:28
    #37663335
Leonidv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java performance & GC
ОзверинLeonidvЛибо хранить в ehcache и разрешить ему записывать данные на диск. Еще, похоже, есть вариант память перед CPU. Если задача позволяет, можно делать так. Находим первый ключ, обрабатываем все строки, для которых он нужен. Запоминаем его и находим второй ключ. И т.д. Минус в том, что файл будет прочитан столько раз, сколько у вас ключей. Плюс в том, что если ключей много, то нагрузка на память будет существенно меньше.

Файл в запакованном виде 4 гига. Боюсь соврать, там вроде 27 миллионов записей.
Не уловил связи между этой информацией и моим ответом :)
...
Рейтинг: 0 / 0
15.02.2012, 16:34:43
    #37663337
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java performance & GC
Почему вы решили что OutOfMemoryError связан с работой GC, а не с банальной нехваткой памяти?

Строки имеют свойство переиспользовать char[], при, например substring().Не получается ли так что String[] у вас все экземпляры ссылаются на String целой строки, которую вы считали?

В MyEntity много строк?

Почему был выбран подход чтения строками, а не потоком символов?
...
Рейтинг: 0 / 0
15.02.2012, 16:34:46
    #37663338
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java performance & GC
Petro123Озверин,
колись и не стесняйся лохануться. Просто нужен свежий взгляд.
95 процентов всех причин - простые (с - статистика авиапроисшествий).

Так а чего колоться? Я сижу туплю...спрашивайте ;)
...
Рейтинг: 0 / 0
15.02.2012, 16:37:32
    #37663352
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java performance & GC
BlazkowiczПочему вы решили что OutOfMemoryError связан с работой GC, а не с банальной нехваткой памяти?

Строки имеют свойство переиспользовать char[], при, например substring().Не получается ли так что String[] у вас все экземпляры ссылаются на String целой строки, которую вы считали?

В MyEntity много строк?

Почему был выбран подход чтения строками, а не потоком символов?

Насчет CG - нельзя же себя ругать, поругал его )

Не получается ли так что String[] у вас все экземпляры ссылаются на String целой строки, которую вы считали?
разумно. Сейчас будем смотреть.
...
Рейтинг: 0 / 0
15.02.2012, 16:39:21
    #37663357
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java performance & GC
На сколько сложно отказатся от String в пользу char[] и CharSequence?
...
Рейтинг: 0 / 0
15.02.2012, 16:45:53
    #37663385
Большой Синий Кит
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java performance & GC
LeonidvОзверин,

mapreduce.

Вот правильный ответ.
...
Рейтинг: 0 / 0
15.02.2012, 16:47:18
    #37663391
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java performance & GC
Большой Синий КитLeonidvmapreduce.
Вот правильный ответ.
Обоснуй.
...
Рейтинг: 0 / 0
15.02.2012, 16:53:59
    #37663418
Большой Синий Кит
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java performance & GC
Blazkowicz,

Записей очень много. Производить конечный расчет можно только имея все записи распарсенными. Загрузить их все в виде объектов не получается - очень много памяти. То есть нужно уменьшить количество записей, которые нужно распарсить. Остается только одно - mapreduce. Честно говоря, ничего другого, на мой взгляд, нету. Синхронно производить обработку этих данных для получения их в более компактной форме, или нет - это уже неважно. Но идея именно в этом. А это мапредьюс.
...
Рейтинг: 0 / 0
15.02.2012, 16:56:55
    #37663429
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java performance & GC
Blazkowicz В MyEntity много строк?




По сути 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, т.е. не факт, что каждая новая строка создат и кинет в кэш новую сущность
...
Рейтинг: 0 / 0
15.02.2012, 16:57:58
    #37663433
Большой Синий Кит
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java performance & GC
ОзверинBlazkowicz В MyEntity много строк?




По сути 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, т.е. не факт, что каждая новая строка создат и кинет в кэш новую сущность

Ну вот, мапредьюс.
...
Рейтинг: 0 / 0
15.02.2012, 16:58:33
    #37663436
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java performance & GC
ОзверинПо сути myEntity - это одна строка.
если у строк ключ совпадает, то мы просто в 1ой сущности суммируем поле1 и поле2, т.е. не факт, что каждая новая строка создат и кинет в кэш новую сущность
Какая длина строки и сколько уникальных по ключу сущностей в файле?
...
Рейтинг: 0 / 0
15.02.2012, 17:00:13
    #37663439
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java performance & GC
Большой Синий Кит,
а почему БД не подходит:
- сливаем сырые данные
- в фоне достаём - обработал - положил
?
...
Рейтинг: 0 / 0
15.02.2012, 17:01:40
    #37663445
Большой Синий Кит
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java performance & GC
Petro123Большой Синий Кит,
а почему БД не подходит:
- сливаем сырые данные
- в фоне достаём - обработал - положил
?

Почему не подходит? Подходит, согласен. Просто тут ведь нет в исходных данных БД...
...
Рейтинг: 0 / 0
15.02.2012, 17:03:10
    #37663450
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java performance & GC
Petro123Большой Синий Кит,
а почему БД не подходит:
- сливаем сырые данные
- в фоне достаём - обработал - положил
?
Импортируем в MySQL. Пишем SQL запрос. Profit!
...
Рейтинг: 0 / 0
15.02.2012, 17:03:32
    #37663452
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java performance & GC
BlazkowiczОзверинПо сути myEntity - это одна строка.
если у строк ключ совпадает, то мы просто в 1ой сущности суммируем поле1 и поле2, т.е. не факт, что каждая новая строка создат и кинет в кэш новую сущность
Какая длина строки и сколько уникальных по ключу сущностей в файле?

Длина строки сильно варьироваться может. Условно мы говорим о 1500 символах в строке. (примерно такой порядок)
Насчет кол-ва сущностей, очень трудно сказать.

1 уникальный ключ на строку - может быть
>1 уникального ключа на строку - тоже(работаю с логом стороннего разработчика, за что купил, как говорится)
<1 уникального ключа на строку - если она будет агрегирована с предыдущими строками
...
Рейтинг: 0 / 0
15.02.2012, 17:05:02
    #37663460
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java performance & GC
BlazkowiczPetro123Большой Синий Кит,
а почему БД не подходит:
- сливаем сырые данные
- в фоне достаём - обработал - положил
?
Импортируем в MySQL. Пишем SQL запрос. Profit!

я честно сказать первым делом предложил именно этот вариант. Но "начальство" сверху сильно меня ограничило ;)
я как бе заметил, что для агрегирования большого кол-ва даанных бд и созданы..но там что то с ресурсами сервака и одновременной работой нескольих таких паресров.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Java performance & GC / 25 сообщений из 42, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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