![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
freshAngel |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 248 Регистрация: 1.10.2008 Репутация: нет Всего: нет |
Привет.
Какую коллекцию лучше выбрать, что - бы хранить 300000 строк!? Сейчас:
Собственно будет храниться 300000 ArrayList'ов в векторе. Сейчас все это тормозит ужасно!!! -Xms1024m -Xmx1024m не помогает... |
|||
|
||||
Kircul |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 166 Регистрация: 20.2.2007 Репутация: 6 Всего: 7 |
ИМХО, в таком случае проще использовать БД
|
|||
|
||||
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Лучше всего массивы. Что именно тормозит. Объекты лежат в листе, их никто не трогает и все тормозит? -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
freshAngel |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 248 Регистрация: 1.10.2008 Репутация: нет Всего: нет |
При использовании БД тормозит еще хуже... Поэтому перешел на хэш. Беру кусок из БД и записываю его в хэш, а дальше прогоняю циклами, if'ми... Добавлено @ 18:15 Нажимаю кнопку "Найти" в этот момент заполняются вектора и происходит их обработка, далее жду минут сорок, пока не вывалится ексепшн: memory heap size... Это сообщение отредактировал(а) freshAngel - 9.12.2009, 18:16 |
|||
|
||||
Kircul |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 166 Регистрация: 20.2.2007 Репутация: 6 Всего: 7 |
Ну попробуй LinkedList использовать, если заранее не известен размер коллекции, в противном случае в конструкторе укажи кол-во элементов.
|
|||
|
||||
freshAngel |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 248 Регистрация: 1.10.2008 Репутация: нет Всего: нет |
Можно попробовать, только вот добавление в конец быстрей в ArrayList и рандомный поиск элементов быстрей в ArrayList вместе с сортировкой.
А LinkedList быстрей только при добавлении в начало... Есть еще варианты!? |
|||
|
||||
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Что означает, что памяти все таки нехватает и дело не в том, какая коллекция используется. По сравнению с размером данных, накладные расходы на саму коллекцию пренебрежимо малы. Надо или увеличить объем памяти, или как-то оптимизировать объемы данных. Добавлено через 1 минуту и 44 секунды На больших объемах LinkedList будет тратить больше памяти на один элемент. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
freshAngel |
|
||||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 248 Регистрация: 1.10.2008 Репутация: нет Всего: нет |
Как можно оптимизировать!? Что можно сделать со строкой!? ![]() У меня в коде очень много сверок в условиях с equals и регулярными выражениями, вот пример кода:
Это сообщение отредактировал(а) freshAngel - 9.12.2009, 18:34 |
||||||
|
|||||||
Kircul |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 166 Регистрация: 20.2.2007 Репутация: 6 Всего: 7 |
На сколько я знаю ArrayList это только обертка на массив и при превышении размера созданного массива происходит создание нового с большим размером и копирование в него всех елементов. А при использование LinkedList каждый раз выделяется место только для одного элемента и он линкуется к уже созданной коллекции. Я где-то заблуждаюсь? Т.е. до срабатывания сборщика мусора мы имеем кучу засоренной памяти. Вероятно это так же как и при конкатенации строк при помощи + или StringBuffer Это сообщение отредактировал(а) Kircul - 9.12.2009, 18:38 |
|||
|
||||
LSD |
|
||||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Скорее всего общих советов, будет недостаточно, надо разбираться с конкретным случаем отдельно. Если много дупликатов строк, можно их интернировать. Можно загрузить часть строк, обработать, записать промежуточные результаты в базу/файл, загрузить следующую партию и т.д. Вообщем надо смотреть на конкретный код.
Все так, но давай посчитаем (для 32-х битной JVM):
LinkedList же на больших объемах, тратит на каждый элемент 20 байт.
Перед тем как будет выкинут OutOfMemoryError, всегда вызывается сборщик мусора. Так, что в данном случае не это вызывает проблему. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
||||
|
|||||
v2v |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1620 Регистрация: 20.9.2006 Где: Киев Репутация: 8 Всего: 56 |
а else есть ? нет? зачем выбирать из базы записи если вы их потом отфильтровываете? возможно стоит пересмотреть условия по которому запись заноситься в коллекцию и уже на этом этапе выбрасывать не нужные записи? |
||||
|
|||||
Kircul |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 166 Регистрация: 20.2.2007 Репутация: 6 Всего: 7 |
Так-то оно так, но если взять такой код
То на моей машине (параметры запуска дефолтные) при INITIAL_CAPACITY = 15000000 валится OutOfMemoryError (где-то на кол-ве в 7600000), но если поставить INITIAL_CAPACITY в аргументы конструктора то все работает нормально, при INITIAL_CAPACITY = 16000000 валится в обоих случаях. Т.е. при указании правильного кол-ва в аргументы конструктора мы выигрываем в 2 раза больше памяти. При использовании LinkedList падает ошибка и на 7600000. Есть информация к размышлению... |
||||
|
|||||
ivanovpv |
|
||||
![]() Варвар ![]() ![]() Профиль Группа: Участник Сообщений: 639 Регистрация: 26.1.2005 Где: Москва Репутация: 4 Всего: 28 |
Конечно же надо ставить все это безобразие на БД, индексировать строки и обращаться через нормальные select'ы... - типа:
Ну решите вы сейчас на 300 тыс. строк, а если будет 300 миллионов строк? Никакого хипа не хватит и никаких коллекций Операция equals() на String'е очень дорогая операция знаете ли... А любая нормальная СУБД справится с select'ом на 300 тыс. записей за доли секунды - отвечаю ![]() Так что подумайте что лучше сидеть перед монитором 40 минут в ожидании OutOfMemory или перенести все в БД и написать через JDBC интерфейс и получать результаты за секунды. Это сообщение отредактировал(а) ivanovpv - 9.12.2009, 21:29 -------------------- Aut viam inveniam aut faciam |
||||
|
|||||
serger |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 19.6.2007 Где: Ижевск Репутация: 1 Всего: 5 |
Посмотри вариант Bercley DB
Специально для больших хэшей - сомневаюсь, что свой велосипед будет много лучше... http://ru.wikipedia.org/wiki/Berkeley_DB http://www.oracle.com/technology/products/...y-db/index.html -------------------- упс! |
|||
|
||||
LSD |
|
||||||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Информация то конечно, есть. Но тут надо учитывать таку вещь как особенности работы Java со строками. В твоем случае, у тебя всего один екземпляр строки, с таким же успехом можно инициализировать коллекцию null-ами. Вот более коплексный пример с одинаковыми, разными и вообще нулевыми строками:
Запускать с ключем: -Xmx128M -Xms128M Результат:
Видно, что результаты со статичной строкой и нулевой практически идентичны. А вот когда уже речь идет о реальных данных, там разница между коллекциями не так заметна, сказывается, что основную часть памяти потребляют объекты. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |