Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Массив строк и память, как подружить 
:(
    Опции темы
serghd
Дата 28.1.2010, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 5.10.2009

Репутация: нет
Всего: нет



Цитата(ernando @ 28.1.2010,  18:47)
serghd, а можешь описать входные условия, ради чего тебе в памяти нужно дербанить 75к объектов, тем более массивов? Просто за все вермя работы в IT не приходилось гонять такие объемы, если это не было узкоспециализированной задачей, но там уже действительно выбирается другое железо и тюнится сама JVM.

диапазоны IP адресов стран, нужно их перебирать для выяснения к какой стране относится ip. Для перебора - пропарсить xml с ними (каждый item будет иметь 6 типов данных - страна, ip_start, ip_end и др., поэтому и массив) и поместить в ArrayList, с которым потом и сравнивать. 
Почему установка VM Options -Xmx1600M не помогает, ей что, для такого массива надо больше 1600 мегабайт??

Это сообщение отредактировал(а) serghd - 28.1.2010, 19:01
PM MAIL   Вверх
andrew_121
Дата 28.1.2010, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: нет
Всего: 33



Цитата(LSD @  28.1.2010,  18:45 Найти цитируемый пост)
Ну можно попробовать пересоздать ArrayList и вызвать у него ensureCapacity() увеличив его немного по сравнению с предыдущим результатом.

да, один из вариантов.


Цитата(LSD @  28.1.2010,  18:45 Найти цитируемый пост)
Просто в реальных приложениях такая работа на грани означает, что надо что-то радикально менять в алгоритме и/или железе (перейти на 64 бита или нарастить память). 

понимаю.


Цитата(ernando @  28.1.2010,  18:47 Найти цитируемый пост)
ради чего тебе в памяти нужно дербанить 75к объектов, тем более массивов?

мне тоже интересно smile
75к объектов, это нормально.


Цитата(LSD @  28.1.2010,  18:48 Найти цитируемый пост)
Кстати в данном случае, можно в класс Item добавить ссылку на следующий элемент и таким образом организовать связный список. Если нужна только однонаправленная итерация по списку, то это будет самый экономный способ динамического выделения памяти

велосипед?

кстати в моем варианте кода, получилось создать 100к объектов. просто добавил опцию для ВМ -Xmx128M.
того, в сумме создано 800 000 строк. замечу не мало smile 


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
LSD
Дата 28.1.2010, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(serghd @  28.1.2010,  18:58 Найти цитируемый пост)
ей что, для такого массива надо больше 1600 мегабайт??

Сам ArrayList будет занимать около 75 килобайт, остальное твои объекты.


--------------------
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.
PM MAIL WWW   Вверх
jk1
Дата 28.1.2010, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 40
Всего: 75



serghd, почему вы так уверены что дело именно в массиве? Вы профайлер запускали, смотрели, кто именно жрет память?


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
serghd
Дата 28.1.2010, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 5.10.2009

Репутация: нет
Всего: нет



Цитата(LSD @ 28.1.2010,  19:12)
Цитата(serghd @  28.1.2010,  18:58 Найти цитируемый пост)
ей что, для такого массива надо больше 1600 мегабайт??

Сам ArrayList будет занимать около 75 килобайт, остальное твои объекты.

Какие мои, кроме 75к String[] и одного ArrayList практически ничего нет в программе!
PM MAIL   Вверх
LSD
Дата 28.1.2010, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(serghd @  28.1.2010,  19:15 Найти цитируемый пост)
Какие мои, кроме 75к String[] и одного ArrayList практически ничего нет в программе! 

1. Я говорил про ArrayList, но не про 75к String[].
2. 
Код

  public static void main(String[] args)
  {
    ArrayList<String[]> list = new ArrayList<String[]>();
    for (int i = 0; i < 75000; i ++)
    {
     String[] mas = {"text" + i, "text2" + i};
     list.add(mas);
    }
    logger.info("list.si = " + list.size());
  }

спокойно отрабатывает и на 64 Мб.


--------------------
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.
PM MAIL WWW   Вверх
serghd
Дата 28.1.2010, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 5.10.2009

Репутация: нет
Всего: нет



Цитата(LSD @ 28.1.2010,  19:20)
Цитата(serghd @  28.1.2010,  19:15 Найти цитируемый пост)
Какие мои, кроме 75к String[] и одного ArrayList практически ничего нет в программе! 

1. Я говорил про ArrayList, но не про 75к String[].
2. 
Код

  public static void main(String[] args)
  {
    ArrayList<String[]> list = new ArrayList<String[]>();
    for (int i = 0; i < 75000; i ++)
    {
     String[] mas = {"text" + i, "text2" + i};
     list.add(mas);
    }
    logger.info("list.si = " + list.size());
  }

спокойно отрабатывает и на 64 Мб.

Этот срабатывает и у меня.
Но реальная задача:
VM Options: -Xmx512m (запуск нормальный, т.е. было выделено)
Код всей программы (для разбора xml используется qt jambi):
Код

 public static void main(String[] args)
 {
  ArrayList<String[]> geoIp = new ArrayList<String[]>();

  QFile xmlFile = new QFile("geoip.xml");
  if (!xmlFile.exists()) System.out.println("file not exists");
  else
  {
   QDomDocument doc = new QDomDocument();
   doc.setContent(xmlFile);
   QDomElement docElement = doc.documentElement();
   QDomElement node = docElement.firstChildElement();

   while(!node.isNull())
   {
    String[] mas = new String[6];
    mas[0] = node.attribute("ip_start");
    mas[1] = node.attribute("ip_end");
    mas[2] = node.attribute("num_ip_start");
    mas[3] = node.attribute("num_ip_end");
    mas[4] = node.attribute("flag");
    mas[5] = node.text();
    geoIp.add(mas);

    node = node.nextSiblingElement();
   }
  }
 }

Всего 70040 строк. Без "geoIp.add(mas);" 1 секунда работы без ошибок. С ним вылетает.



Это сообщение отредактировал(а) serghd - 28.1.2010, 20:07
PM MAIL   Вверх
andrew_121
Дата 28.1.2010, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: нет
Всего: 33



смотрю на код, и не въезжаю...какой же тайный смысл кроется в -
Цитата(serghd @  28.1.2010,  19:45 Найти цитируемый пост)
ArrayList<String[]> geoIp = new ArrayList<String[]>();

почему бы не воспользоваться классом состоящим их шести полей типа строки?
в таком случае, ситуация немного измениться по двум причинам:
1. класс с шестью строками != массив строк. возможно и памяти для него требуется меньше.
2. свойства класса можно назвать внятными именами, соответственно, работать с ним проще.
3. это:
Цитата(serghd @  28.1.2010,  19:45 Найти цитируемый пост)
    String[] mas = new String[6];
    mas[0] = node.attribute("ip_start");
    mas[1] = node.attribute("ip_end");
    mas[2] = node.attribute("num_ip_start");
    mas[3] = node.attribute("num_ip_end");
    mas[4] = node.attribute("flag");
    mas[5] = node.text();

выглядит как-то нелепо, батарею напоминает smile

в общем, простите новичка, если глупость сказал smile 

Это сообщение отредактировал(а) andrew_121 - 28.1.2010, 21:09


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
serghd
Дата 28.1.2010, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 5.10.2009

Репутация: нет
Всего: нет



Цитата(andrew_121 @ 28.1.2010,  21:08)
смотрю на код, и не въезжаю...какой же тайный смысл кроется в -
Цитата(serghd @  28.1.2010,  19:45 Найти цитируемый пост)
ArrayList<String[]> geoIp = new ArrayList<String[]>();

почему бы не воспользоваться классом состоящим их шести полей типа строки?

потому что результат тот же. На всякий случай:
Код

  public static void main(String[] args)
 {
  QFile xmlFile = new QFile("geoip.xml");
  if (!xmlFile.exists()) System.out.println("file not exists");
  else
  {
   QDomDocument doc = new QDomDocument();
   doc.setContent(xmlFile);
   QDomElement docElement = doc.documentElement();
   QDomElement node = docElement.firstChildElement();

   ArrayList<GeoIPNode> geoIp = new ArrayList<GeoIPNode>();

   while(!node.isNull())
   {
    GeoIPNode geoNode = new GeoIPNode();
    geoNode._ip_start = node.attribute("ip_start");
    geoNode._ip_end = node.attribute("num_ip_end");
    geoNode._num_ip_start = node.attribute("num_ip_start");
    geoNode._num_ip_end = node.attribute("num_ip_end");
    geoNode._flag = node.attribute("flag");
    geoNode._country_name = node.text();
                                      
    geoIp.add(geoNode);
    node = node.nextSiblingElement();
   }
  }
 }


public class GeoIPNode
{
 String _ip_start, _ip_end, _num_ip_start, _num_ip_end, _flag, _country_name;
}





Цитата(andrew_121 @ 28.1.2010,  21:08)

String[] mas = new String[6];
    mas[0] = node.attribute("ip_start");
    mas[1] = node.attribute("ip_end");
    mas[2] = node.attribute("num_ip_start");
    mas[3] = node.attribute("num_ip_end");
    mas[4] = node.attribute("flag");
    mas[5] = node.text();

берутся аттрибуты item'a, батарея будет в любом случае, это не "Random()". У меня такой массив без вылета работает максимум на 25 000 итераций, если без установок. С -Xmx512m вобщем-то тоже самое.
Пробовал также делить 75к на 7 частей и пихать их в отдельные Vector'ы, потом группировать в один, то же самое.

Это сообщение отредактировал(а) serghd - 28.1.2010, 21:42
PM MAIL   Вверх
serghd
Дата 28.1.2010, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 5.10.2009

Репутация: нет
Всего: нет



дело было именно в xml, либо реализации механизма работы с ним со стороны jambi. Забивает память, что больше 20к строк лучше не запоминать. Попробовал считывать данные из csv-формата (построчно как обычный текстовый файл) и заносить их в ArrayList - всё норм.
PM MAIL   Вверх
LSD
Дата 29.1.2010, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(serghd @  28.1.2010,  19:45 Найти цитируемый пост)
для разбора xml используется qt jambi

Ну вот нафига? Есть же SAX/StAX, которые в данной ситуации намного лучше подходят.

Да и хранить IP в строке, тоже как минимум "странно".


--------------------
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.
PM MAIL WWW   Вверх
serghd
Дата 29.1.2010, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 5.10.2009

Репутация: нет
Всего: нет



Цитата(LSD @ 29.1.2010,  10:51)
Цитата(serghd @  28.1.2010,  19:45 Найти цитируемый пост)
для разбора xml используется qt jambi

Ну вот нафига? Есть же SAX/StAX, которые в данной ситуации намного лучше подходят.

Да и хранить IP в строке, тоже как минимум "странно".


>>Есть же SAX/StAX
Я использую DOM, а не SAX и jambi(при том, что весь проект на ней основан) для этого является очень удобным инструментом. Откуда мне было знать, что цикл с ним с более 20к итераций вызовет memory overflow.

>>Да и хранить IP в строке, тоже как минимум "странно".
А где же их ещё хранить? Там не только один ip. В БД типа mysql?)
Парсится всё равно только 1 раз во время загрузки программы.
Пример одного нода:
<country ip_start="2.6.190.56" ip_end="2.6.190.63" num_ip_start="33996344" num_ip_end="33996351" flag="GB" >United Kingdom</country>

Это сообщение отредактировал(а) serghd - 29.1.2010, 14:08
PM MAIL   Вверх
LSD
Дата 29.1.2010, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(serghd @  29.1.2010,  14:04 Найти цитируемый пост)
А где же их ещё хранить?

С точки зрения экономии памяти - int для IPv4, или long, тогда будет проще сравнивать.


--------------------
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.
PM MAIL WWW   Вверх
serghd
Дата 29.1.2010, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 5.10.2009

Репутация: нет
Всего: нет



да, но в любом случае мне придётся конвертировать. Аттрибуты num_ip_start="33996344"  и num_ip_end="33996351" содержат числовое представление ip, которое и буду переводить в int для сравнения. А что, можно разве как-то реализовать без конвертирования?
PM MAIL   Вверх
LSD
Дата 29.1.2010, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Я не совсем понял, что такое num_ip_start, что это за число?


--------------------
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.
PM MAIL WWW   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1110 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.