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

Поиск:

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


Шустрый
*


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

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



Диапазон от num_ip_start до num_ip_end равноценен диапазону ip-адресов ip_start до ip_end. Путём простого преобразования их можно переводить один в другой. Сделано специально для удобства определения входит Ip в диапазон или нет.
PM MAIL   Вверх
LSD
Дата 29.1.2010, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Я не понял, как это число связано с IP адресом? Это просто IP представленный как int, так?


--------------------
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, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(LSD @ 29.1.2010,  14:58)
Я не понял, как это число связано с IP адресом? Это просто IP представленный как int, так?

да

Добавлено @ 15:14
простой код 
Код

   DOMParser parser = new DOMParser();
   try {
    parser.parse("geoip.xml");
   } catch (SAXException ex) {
    Logger.getLogger(Ui_Form.class.getName()).log(Level.SEVERE, null, ex);
   } catch (IOException ex) {
    Logger.getLogger(Ui_Form.class.getName()).log(Level.SEVERE, null, ex);
   }
   Document doc = parser.getDocument();

   NodeList nodes = doc.getElementsByTagName("country");
   System.out.println("There are " + nodes.getLength() +
      "  elements.");

с использованием xerces тоже выдал ошибку о переполнении. Блин, придётся наверно отказаться от xml, и парсить обычный текстовый файл.
Хотя установка -Xmx256m на этот раз помогла.

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


Leprechaun Software Developer
****


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

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



Используй StAX. (если выложишь пример XML, могу попробовать наваять примерчик)


--------------------
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, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE geoIp>
<countries>
 <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>
 <country ip_start="3.0.0.0" ip_end="4.17.135.31" num_ip_start="50331648" num_ip_end="68257567" flag="US" >United States</country>
 <country ip_start="4.17.135.32" ip_end="4.17.135.63" num_ip_start="68257568" num_ip_end="68257599" flag="CA" >Canada</country>
 <country ip_start="4.17.135.64" ip_end="4.17.142.255" num_ip_start="68257600" num_ip_end="68259583" flag="US" >United States</country>
 <country ip_start="4.17.143.0" ip_end="4.17.143.15" num_ip_start="68259584" num_ip_end="68259599" flag="CA" >Canada</country>
</countries>
Спасиб.
PM MAIL   Вверх
Amp
Дата 29.1.2010, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Если уж хочется завязки на QtJambi, то в модуле QtXml есть необходимые средства - глава про "The Qt SAX2 Classes".
PM MAIL   Вверх
serghd
Дата 29.1.2010, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Amp @ 29.1.2010,  15:36)
Если уж хочется завязки на QtJambi, то в модуле QtXml есть необходимые средства - глава про "The Qt SAX2 Classes".

Так я и так использовал jambi, но DOM. А что, в моём случае (~75000 нодов) SAX наверняка поможет?
PM MAIL   Вверх
Amp
Дата 29.1.2010, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(serghd @  29.1.2010,  15:38 Найти цитируемый пост)
Так я и так использовал jambi, но DOM. А что, в моём случае (~75000 нодов) SAX наверняка поможет? 

Потребление памяти самим SAX-парсером практически не зависит от размеров исходного xml-документа и достаточно мало. В отличии от DOM-парсеров, где надо в памяти хранить дерево со считанными элементами/нодами. Почитайте как это работает - все станет ясно.

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


Шустрый
*


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

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



Цитата(Amp @ 29.1.2010,  19:03)
Цитата(serghd @  29.1.2010,  15:38 Найти цитируемый пост)
Так я и так использовал jambi, но DOM. А что, в моём случае (~75000 нодов) SAX наверняка поможет? 

Потребление памяти самим SAX-парсером практически не зависит от размеров исходного xml-документа и достаточно мало. В отличии от DOM-парсеров, где надо в памяти хранить дерево со считанными элементами/нодами. Почитайте как это работает - все станет ясно.

спасибо, а у вас случайно нету практического примера на jambi хоть какого-нибудь? А то в инете весьма трудно найти, максимум на с++. Тролли и так весьма скупы на примеры, а для sax их вообще в оф. документации нет.

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


Leprechaun Software Developer
****


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

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



Пока просто код без комментариев, через пару дней напишу статью в FAQ.
Код

package test;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.*;

public class GeoIpParser
{
  private static final QName countryTagName = new QName("country");
  private static final QName ipStartAttribName = new QName("ip_start");
  private static final QName ipEndAttribName = new QName("ip_end");
  private static final QName flagAttribName = new QName("flag");

  private XMLInputFactory factory = XMLInputFactory.newInstance();
  private Attribute ipStart;
  private Attribute ipEnd;
  private Attribute flag;
  private StringBuilder chars = new StringBuilder();
  private boolean isInsideCountryTag = false;
  private List<GeoIPv4Adress> adresses;

  public static void main(String[] args)
  {
    GeoIpParser parser = new GeoIpParser();
    try
    {
      List<GeoIPv4Adress> geoIPv4AdressList = parser.parse(new File("xml/geo-ip.xml"));
      for(GeoIPv4Adress adress : geoIPv4AdressList)
      {
        System.out.println(adress);
      }
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
  }

  public List<GeoIPv4Adress> parse(File file) throws IOException, XMLStreamException
  {
    FileInputStream in = new FileInputStream(file);
    XMLEventReader eventReader = factory.createXMLEventReader(in);

    adresses = new ArrayList<GeoIPv4Adress>();

    while(eventReader.hasNext())
    {
      XMLEvent xmlEvent = eventReader.nextEvent();
      switch(xmlEvent.getEventType())
      {
        case XMLStreamConstants.START_ELEMENT:
          processStartElement(xmlEvent.asStartElement());
          break;

        case XMLStreamConstants.CHARACTERS:
          processCharacters(xmlEvent.asCharacters());
          break;

        case XMLStreamConstants.END_ELEMENT:
          processEndElement(xmlEvent.asEndElement());
          break;
      }
    }

    List<GeoIPv4Adress> result = adresses;
    adresses = null;
    return result;
  }

  private void processStartElement(StartElement element)
  {
    if(element.getName().equals(countryTagName))
    {
      ipStart = element.getAttributeByName(ipStartAttribName);
      ipEnd = element.getAttributeByName(ipEndAttribName);
      flag = element.getAttributeByName(flagAttribName);
      isInsideCountryTag = true;
    }
  }

  private void processEndElement(EndElement element)
  {
    if(element.getName().equals(countryTagName))
    {
      createGeoIPv4Adress();

      ipStart = null;
      ipEnd = null;
      flag = null;
      chars.setLength(0);
      isInsideCountryTag = false;
    }
  }

  private void createGeoIPv4Adress()
  {
    try
    {
      adresses.add(GeoIPv4Adress.parse(ipStart.getValue(), ipEnd.getValue(), flag.getValue(), chars.toString()));
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
  }

  private void processCharacters(Characters characters)
  {
    if(isInsideCountryTag)
    {
      chars.append(characters.getData());
    }
  }
}

Код

package test;

import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 * Created 01.02.2010 13:12:11
 *
 * @author $Id:$
 */
public class GeoIPv4Adress
{
  private static final int SIZE = 4;
  private static final long MASK = 0xFFFFFFFFL;

  private final int startAdress;
  private final int endAdress;
  private final String countryIsoCode;
  private final String countryName;

  public GeoIPv4Adress(int startAdress, int endAdress, String countryIsoCode, String countryName)
  {
    this.startAdress = startAdress;
    this.endAdress = endAdress;
    this.countryIsoCode = countryIsoCode;
    this.countryName = countryName;
  }

  public GeoIPv4Adress(byte[] startAdress, byte[] endAdress, String countryIsoCode, String countryName)
  {
    this(toInt(startAdress), toInt(endAdress), countryIsoCode, countryName);
  }

  public String getCountryIsoCode()
  {
    return countryIsoCode;
  }

  public String getCountryName()
  {
    return countryName;
  }

  public int getStartAsInt()
  {
    return startAdress;
  }

  public byte[] getStartAsBytes()
  {
    return toByteArray(startAdress);
  }

  public InetAddress getStartAsInetAddress() throws UnknownHostException
  {
    return InetAddress.getByAddress(getStartAsBytes());
  }

  public int getendAsInt()
  {
    return endAdress;
  }

  public byte[] getEndAsBytes()
  {
    return toByteArray(endAdress);
  }

  public InetAddress getEndAsInetAddress() throws UnknownHostException
  {
    return InetAddress.getByAddress(getEndAsBytes());
  }

  public boolean isInRange(final int ip)
  {
    long lip = MASK & ip;
    return ((startAdress & MASK) <= lip) && (lip >= (endAdress & MASK));
  }

  @Override
  public String toString()
  {
    StringBuilder buffer = new StringBuilder(getClass().getSimpleName()).append("[");

    buffer.append(countryName).append(" (").append(countryIsoCode).append("): ");

    byte[] bytes = getStartAsBytes();
    for(int i = 0; i < bytes.length; i++)
    {
      if(i > 0)
        buffer.append('.');
      buffer.append(Integer.toString(bytes[i] & 0xFF));
    }

    buffer.append(" - ");

    bytes = getEndAsBytes();
    for(int i = 0; i < bytes.length; i++)
    {
      if(i > 0)
        buffer.append('.');
      buffer.append(Integer.toString(bytes[i] & 0xFF));
    }

    buffer.append(']');
    return buffer.toString();
  }

  public static GeoIPv4Adress parse(String startIp, String endIp, String countryIsoCode, String countryName)
  {
    return new GeoIPv4Adress(parse(startIp), parse(endIp), countryIsoCode, countryName);
  }

  public static byte[] parse(String ip)
  {
    final String[] strings = ip.split("\\.");
    if(strings.length != SIZE)
      throw new IllegalArgumentException("Invalid input string - '" + ip + "'");

    byte[] bytes = new byte[SIZE];
    for(int i = 0; i < strings.length; i++)
    {
      String s = strings[i];
      int b = Integer.parseInt(s);
      if(b < 0 || b > 255)
        throw new IllegalArgumentException("Invalid input string - '" + ip + "'");

      bytes[i] = (byte) b;
    }
    return bytes;
  }

  private static byte[] toByteArray(final int i)
  {
    byte[] bytes = new byte[SIZE];
    bytes[0] = (byte) ((i >>> 24) & 0xFF);
    bytes[1] = (byte) ((i >>> 16) & 0xFF);
    bytes[2] = (byte) ((i >>> 8) & 0xFF);
    bytes[3] = (byte) (i & 0xFF);
    return bytes;
  }

  private static int toInt(final byte[] bytes)
  {
    if(bytes.length != SIZE)
      throw new IllegalArgumentException("Invalid array length, expected - 4, found - " + bytes.length);

    return ((bytes[0] & 0xFF) << 24) +
           ((bytes[1] & 0xFF) << 16) +
           ((bytes[2] & 0xFF) << 8) +
           (bytes[3] & 0xFF);
  }
}

Я немного изменил XML, убрал ненужные данные:
Код

<?xml version="1.0" encoding="UTF-8"?>
<countries>
  <country ip_start="2.6.190.56" ip_end="2.6.190.63" flag="GB">United Kingdom</country>
  <country ip_start="3.0.0.0" ip_end="4.17.135.31" flag="US">United States</country>
  <country ip_start="4.17.135.32" ip_end="4.17.135.63" flag="CA">Canada</country>
  <country ip_start="4.17.135.64" ip_end="4.17.142.255" flag="US">United States</country>
  <country ip_start="4.17.143.0" ip_end="4.17.143.15" flag="CA">Canada</country>
</countries>



--------------------
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
Дата 2.2.2010, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



 smile 
насчёт статьи, думаю, и правда пригодилась бы.
п.с. код (второй блок) выглядит жутковато)), комменты действительно не помешали бы. Видна рука профессионала. 

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


Leprechaun Software Developer
****


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

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



Цитата(LSD @  1.2.2010,  20:58 Найти цитируемый пост)
через пару дней напишу статью в FAQ.

Готово..


--------------------
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   Вверх
sergioK
Дата 13.2.2010, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 207
Регистрация: 15.2.2008

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



[QUOTE=LSD,28.1.2010,  18:33]
Цитата(andrew_121 @  28.1.2010,  17:50 Найти цитируемый пост)
1. ArrayList когда у него заканчивается место в массиве (который используется для хранения) создает новый больше предыдущего в 1.5 раза, а потом копирует туда данные из старого.


Цитата(andrew_121 @  28.1.2010,  17:50 Найти цитируемый пост)
2. как в коде(не с помощью ключей) ее выделить?

Никак.



Цитата(andrew_121 @  28.1.2010,  17:50 Найти цитируемый пост)
3. как можно узнать объем объекта(не выделенной памяти)? в с++ есть оператор sizeof().

Честно - нет. А так создают много одинаковых объектов и смотрят, сколько они занимают места. Еще есть извраты через unsafe, рефлексию и т.д.



Цитата(andrew_121 @  28.1.2010,  17:50 Найти цитируемый пост)
4. равноправно ли правило, что строка состоящая из 10-ти символов занимает 10 байт памяти ВМ?

1. Один символ занимает 2 байта (это же Unicode).
2. Строка это объект и у нее есть еще данные кроме самих символов. Да и массив символов тоже потребляет место.
3. Строки могут совместно использовать массивы символов.
4. Некоторые ссылки на строку, могут быть ссылкой на одну и ту же строку.




Цитата(andrew_121 @  28.1.2010,  17:50 Найти цитируемый пост)
поясните пожалуйста. почему так?

Массив это объект. Как и любой объект у него есть накладные расходы: 8 байт на заголовок, 4 байта на длинну, и на данные. В случае с массивом объектов длинны 2 это будет 4*2 байта. Вот и считай, что лучше 2 * (8 + 4 + 75000 * 4) или (8 + 4 + 75000 * 4) + 75000 * (8 + 4 + 2* 4).

т,е , если было 1000 элеметов то выделит 1500,  перекопирует  потом  выделит 2250 , потом снова перекопирует и выделит  потом 3375 
 и т,д, 
откуда предположения что имеено в 1,5раза ,?  




PM MAIL   Вверх
jk1
Дата 13.2.2010, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

откуда предположения что имеено в 1,5раза?  

Исходники ArrayList это объясняют:
Код

 public boolean add(E e) {
    ensureCapacity(size + 1);  
    elementData[size++] = e;
    return true;
    }

Код

public void ensureCapacity(int minCapacity) {
    modCount++;
    int oldCapacity = elementData.length;
    if (minCapacity > oldCapacity) {
        Object oldData[] = elementData;
        int newCapacity = (oldCapacity * 3)/2 + 1;
         if (newCapacity < minCapacity)
        newCapacity = minCapacity;
            // minCapacity is usually close to size, so this is a win:
            elementData = Arrays.copyOf(elementData, newCapacity);
    }
    }  


Это сообщение отредактировал(а) jk1 - 13.2.2010, 12:19


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


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 207
Регистрация: 15.2.2008

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



Цитата(jk1 @ 13.2.2010,  12:18)
Цитата

откуда предположения что имеено в 1,5раза?  

Исходники ArrayList это объясняют:
Код

 public boolean add(E e) {
    ensureCapacity(size + 1);  
    elementData[size++] = e;
    return true;
    }

Код

public void ensureCapacity(int minCapacity) {
    modCount++;
    int oldCapacity = elementData.length;
    if (minCapacity > oldCapacity) {
        Object oldData[] = elementData;
        int newCapacity = (oldCapacity * 3)/2 + 1;
         if (newCapacity < minCapacity)
        newCapacity = minCapacity;
            // minCapacity is usually close to size, so this is a win:
            elementData = Arrays.copyOf(elementData, newCapacity);
    }
    }  

понятно, значит для решения подобных проблем связанных с нехваткой памяти ,  т,е, фактически нужно создать свой  мемory меnagment 
перегрузив ensureCapacity ,
 не увиличивать массив на 1,5 раза  (тотому что при больших размерах может таки выбить )а скажем добавлять 10 и до тех
пор пока не добавлены все 10 перекачку тоже делать не обязательно )

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

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

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


 




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


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

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