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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Структура данных для большого числа записей 
:(
    Опции темы
CHEM_Eugene
Дата 16.3.2011, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вообще мне нужно реализовать структуру известную как гиперкуб. 
Что она из себя представляет - набор переменных, каждая из которых имеет конечный домен значений.

Например:

Гиперкуб из двух измерений (две переменные - v1 и r1):
[v1] = {000, 001, ... 111} 
[r1] = {v1, v2, v3}

комбинация значений переменных гиперкуба дает целое число, например:
[000][v2] -> 10
[001][v3] -> 500

Я попытался реализовать подобную структуру в виде HashMap<String, Integer>, где
ключом выступает суррогатный ключ типа "000-v2", "001-v3" и т.д.

В итоге в структуре получается (размер домена переменной v1)*(размер домена переменной r1) строк.

И все бы хорошо, но на количестве в миллион строк, программа вылетает с Java Heap Memory exception

Возможно - это не самая лучшая реализация подобной структуры... Подскажите - как можно было бы хранить данные более оптимально в моём случае! 
Я так понимаю мне бы подошел многомерный ассоциативный массив, к тому же он должен быть динамическим. Можете посоветовать что-то подобное?
И вообще, кто-нибудь сталкивался с решением подобной задачи?



PM MAIL   Вверх
COVD
Дата 16.3.2011, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Возможно имеет смысл использовать grid, параллельные вычисления, если ресурсов одного компьютера недостаточно. 

Если недостаточно только памяти, то Terracotta предлагает BigMemory - доступная память как бы расширяется за счет того, что обьекты памяти сериализуются вне кучи. Вообще, любая cache система (например, ehcache) , где обьекты сохраняются на диск, может быть настроена, чтобы функционировать как динамический Map, т.е. в памяти всегда будет только часть обьектов. Но это медленнее.

Это сообщение отредактировал(а) COVD - 16.3.2011, 13:31
PM MAIL   Вверх
CHEM_Eugene
Дата 16.3.2011, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



COVD, я не уверен, что не достаточно одного компьютера. BigMemory - коммерческое решение, мне не подойдет. 

Может быть все же подойдет что-то java-нативное ? 

Ведь 1 млн. int-ов по идее должен убираться в  памяти...
PM MAIL   Вверх
techmax
Дата 16.3.2011, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А памяти сколько выдели для JVM? по умолчанию довольно мало выделяется.

Это сообщение отредактировал(а) techmax - 16.3.2011, 16:55
PM MAIL Skype   Вверх
CHEM_Eugene
Дата 16.3.2011, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(techmax @  16.3.2011,  16:54 Найти цитируемый пост)
А памяти сколько выдели для JVM? по умолчанию довольно мало выделяется.


Да как раз по-умолчанию и выделяю... 

Как мне посчитать нужный размер памяти для моего HashMap?
PM MAIL   Вверх
COVD
Дата 16.3.2011, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Действительно, по умолчанию-то максимальный размер памяти 64М. Может просто увеличить и вопрос решен? Надо в строке запуска приложения указать начальную и максимальную память :

Код

java -Xms64M -Xmx1500M 


Запросите максимально, 1500М. Сколько на самом деле программа получила и сколько свободно, можно замерить и вывести в консоль из программы

Код

       long free = Runtime.getRuntime().freeMemory();
       long total = Runtime.getRuntime().totalMemory();


Это сообщение отредактировал(а) COVD - 16.3.2011, 17:25
PM MAIL   Вверх
CHEM_Eugene
Дата 16.3.2011, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Проблему с памятью решил, расширив ее, но увы, самым ресурсоемким оказался перебор 4 млн значений... Придется что-то менять в постановке задачи
PM MAIL   Вверх
math64
Дата 17.3.2011, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Integer занимает намного больше памяти, чем int, лучше пользоваться обычными массивами.
Код

// если почти все ячейки заняты
int[] array = new int[v1size*r1size]; // одномерный массив, индекс вычисляется v1*r1size+r1
int [][] array2 = new int[v1size][r1size]; // двумерных массив, память под пустые строки может не выделяться
HashMap<String,int[]> map = new HashMap<String,int[]>(); // строка ищется в HashMap, в строка хранится в обычном массиве
//если много пустых ячеек
class HC {
String v1;
String r1;
int value;
    @Override
    public int hashCode() {
        return f(v1.hashCode,r1.hashCode);
    }
    @Override
    public boolean equals(Object obj) {
        return v1.eqals(obj.v1 && r1.equals(obj,r1);
    }
}
HashSet<HC> set = new HashSet<HC>;

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

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

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


 




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


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

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