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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Уменьшение объёма потребляемой памяти 
V
    Опции темы
regen
Дата 5.7.2006, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Доброе время суток.
Сначала вкратце скажу что необходимо мне сделать:
Надо написать просмоторщик для прайсов одной фирмы. Прайсы хранятся в файле. Сейчас готово у меня приложение (GUI) в котором реализован пока метод который открывает файл (JFileChooser) и выводит его в таблицу. 
Таблица зарнее была создана таким образом:
Код

....
private Vector columnIdentifiers = new Vector();
private Vector dataVector = new Vector();
private DefaultTableModel model = new DefaultTableModel(dataVector, columnIdentifiers);

...

outputTable.setModel(model);


затем в конструкторе делаю:
Код

....
columnIdentifiers.addElement("Field 1");
columnIdentifiers.addElement("Field 2");
columnIdentifiers.addElement("Field 3");
columnIdentifiers.addElement("Field 4");
columnIdentifiers.addElement("Field 5");
columnIdentifiers.addElement("Field 6");
columnIdentifiers.addElement("Field 7");
model.fireTableDataChanged();
....


при открытии файла происходит вот что:
Код

in = new BufferedReader(new FileReader(f));
String row;
String[] strRowDate;
for(int i=0; i<model.getRowCount(); i++){
    model.removeRow(i);
}
while(null != (row = in.readLine())){
    Vector data = new Vector();
    strRowDate = row.split("<ku>");
    for(int i=0; i<strRowDate.length; i++){
        data.addElement(strRowDate[i]);
        strRowDate[i] = null;
    }
    dataVector.addElement(data);
}
model.fireTableDataChanged();



Теперь вопрос:
В результате когда я открываю прайс-лист в котором около 200000 наименований (размер файла примерно 9 Mb) то это приложение потребляет чуть больше 70 (!!!) Mb памяти. А ведь это просто открытие файла и вывод в таблицу. Как можно уменьшить объём потребляемой памяти? Может я что-то делаю не так? 
P.S.: До открытия файла приложение потребляет около 5 Mb.
Заранее спасибо 
PM MAIL   Вверх
chief39
Дата 5.7.2006, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


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

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



Ну дык... а что ты хотел....

Погляди сколько занимает 5 символов, сколько занимает объект String, который содержит такие 5 символом, и хотя бы хэшсет(или эррэйлист), который содержит такие String'и.

Понятно, что вытянуть гигабайтную БД на клиента - это будет явно не 100 килобайт smile

По идее, надо подчитывать файл по кускам. При необходимости.
А если надо всё и сразу - то мирись.
Можешь провести рефакторинг, кое-где подчистить, но до 5 Мб с загруженым файлом такого размера не доведёшь.

В 2 бита операционную систему не впихнуть smile 


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
regen
Дата 6.7.2006, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



1) Какие методы сокращения использовании ресурсов памяти вообще существуют в Java? Только ли Hachtable? 
2) Можно ли в Hachtable записать объект типа Vector элементами в котором являются тоже Vector-а (по сути двумерный массив) без потери струкутры и типа? В первоисточнике сказано что hachtable принимает на входе Object (метод put) и возвращает объект типа Object (метод get). Это я спрашиваю из--за того что хочу все данные по таблице (переменая data в модели этой таблицы) хранить в hachtable. Как мне представляется ресурсов будет кушаться меньше. Или я не прав?
Заранее спасибо за ответ 
PM MAIL   Вверх
w1nd
Дата 6.7.2006, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


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

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



Самый действенный и простой (и провереный) способ - явно обнулять все переставшие быть нужными переменные и чистить коллекции.  


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
regen
Дата 6.7.2006, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А если переменную обнулить нельзя? Если она используется постоянно но никак при этом не меняется? Тогда что? 
PM MAIL   Вверх
w1nd
Дата 6.7.2006, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


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

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



В вашем случае:
1. Не закачивать всех данных в таблицу, полные данные записи подгружать при клике на записи;
2. Выгружать содержимое вашего текстового файла во временный файл с возможностью позиционирования на конкретную запись и подгружать только видимые данные. 


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Bulat
Дата 6.7.2006, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

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



Конечно не знаю, до 200000 строк еще не обрабатывал, может не лучший вариант, но если сделать класс-контейнер: (все исключения сам уж разберешь smile )

Код

public class FileElements {
    private... //необходимые поля

    //getter'ы и setter'ы к ним

}


метод в классе для считывания из файла
Код

public class FileRead {
    public FileElements[] getData() {
        List fData = new ArrayList();
        ...
        FileElements element = new FileElements(/*соотв. поля*/);
        fData.add(element);
        ...
        return (FileElements[]) fData.toArray(new FileElements[fData.size()]);
    }
}


и вызываешь все это:
Код

...
    FileRead fr = new FileRead();
    FileElements[] feArray = fr.getData();
    for (int i = 0; i < feArray.length; i++) {
        //feArray[i].getter соотв. поля
    }
...


Сам работаю с БД, использую вот такую конструкцию, а там объемов тоже хватает и вроде бы нормально, терпимо smile     

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


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
chief39
Дата 6.7.2006, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


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

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



Цитата(regen @  6.7.2006,  09:50 Найти цитируемый пост)
Можно ли в Hachtable записать объект типа Vector

Всё что угодно. Ей плевать что ты в ней хранишь. Шлавное, чтоб ты Object потом привёл к нужному виду. Она ничего не будет ломать в Object'e, который отдаёшь ей на хранение.

Мало место у тебя не будет занимать, потому как файл большой.

- Или постраничная подгрузка, как уже советовали,
- или неполная выборка объекта из файла(подгрузка по запросу), как тоже уже советовали,

 


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
w1nd
Дата 6.7.2006, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


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

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



Я однажды делал анализатор логов с предобработкой, где тоже необходимо было все данные лога держать в памяти. Я пришел к результату 10:1 (на десять мегабайт лога моя прога кушала 1 мегабайт памяти). 

Так как основная чать лога представляла собой текстовую информацию (имена, названия, адреса и прочее), я решил избавиться от избыточных данных. Все строки я разбивал на слова, помещал их в словарь, ассоциируя с численным ключом. При сортировке и фильтрации данных я работал не с исходными строками, а с их ключами. Также только ключи я использовал в объектном представлении лога. Сам текст вытаскивался из словаря только при отображении.

Кстати, при таких объемах информации стоит не стоит использовать HashSet, HashMap или Hashtable - медленно работают уже на десятке тысяч элементов. Предпочтительнее TreeSet или TreeMap.
 


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Bozo
Дата 6.7.2006, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



regen, а в чем проблема, на компе нет 70мб памяти? Всего 32? Или сколько? Или нужно 15 таких файлов открыть, каждый в своем окне и 15*70 это много? 
PM   Вверх
Bulat
Дата 6.7.2006, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

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



Bozo, поиск оптимального пути всегда должен приветствоваться, даже если размеры задачи не глобальные smile ИМХО. 


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

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

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


 




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


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

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