Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Какой хеш будет меньше занимать оперативки?


Автор: Suppir 28.3.2011, 21:19
вариант 1:

$зарплата{'Иванов'}=10;
$зарплата{'Петров'}=15;
$зарплата{'Сидоров'}=20;
$опыт_работы{'Иванов'}=3;
$опыт_работы{'Петров'}=5;
$опыт_работы{'Сидоров'}=10;


вариант 2:

$сотрудники{'Иванов'}{'зарплата'}=10;
$сотрудники{'Иванов'}{'опыт работы'}=3;
$сотрудники{'Петров'}{'зарплата'}=15;
$сотрудники{'Петров'}{'опыт работы'}=5;
$сотрудники{'Сидоров'}{'зарплата'}=20;
$сотрудники{'Сидоров'}{'опыт работы'}=10;


Всего около 10 параметров (зарплата, опыт работы, возраст и т.п). и 8 млн. уникальных сотрудников.
Какой вариант хеша будет занимать меньше оперативной памяти?

 

Автор: vivu 28.3.2011, 22:03
по моему занимаемый объём оперативы должен быть одинаковый или во втором варианте чуть меньше

Автор: Suppir 29.3.2011, 08:06
В первом случае создается 10 хешей (по количеству свойств) с 8 млн. пар ключ/значение.
Во втором случае создается 1 сложный хеш с 80 млн. пар ключ/значение.

Я, вот, думаю, можно ли как-то оптимизировать создание такой структуры, потому что для быстрых расчетов необходимо засунуть ее в оперативку, но 2 Гб не хватает :(

Автор: arto 29.3.2011, 09:08
попробуйте переформулировать задачу.

Автор: infarch 29.3.2011, 13:16
А не сделать ли 10 параметров массивом? Если они точно известны, может не стоит хешировать?

Автор: KSURi 29.3.2011, 14:26
Одинаково.

Автор: infarch 30.3.2011, 10:06
с точки зрения памяти может и одинаково, а вот производительность однозначно выиграет, не придется считать лишние хеш суммы.

Автор: Suppir 30.3.2011, 12:50
infarch

в плане производительности выиграет второй вариант? (один большой хеш хешей)

Автор: ZibSoft 30.3.2011, 13:05
Цитата(Suppir @  30.3.2011,  12:50 Найти цитируемый пост)
в плане производительности выиграет второй вариант? (один большой хеш хешей) 

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

Автор: Suppir 30.3.2011, 15:19
По моим замерам получилось, что первый вариант (10 хешей по 8 млн. пар) занимает меньше оперативки.
Сколько занимает второй вариант, так и не удалось узнать, потому что Perl вылетал с "out of memory" на 70 - 80% пути.

Автор: Suppir 30.3.2011, 16:43
Еще выяснил такой момент:

хеш хешей вида

$h{цифровой ID}{параметр}=значение

занимает ровно столько же оперативки, как и двумерный массив

$a[цифровой ID][параметр] = значение




Автор: KSURi 31.3.2011, 02:29
Что-то я не так сделал в первый раз, оказывается и правда первый вариант занимает места меньше, чем второй.

Если вы начинаете считать байты, то используйте соответствующий инструмент. В перле даже undef занимает от 12 до 16 байт.

Автор: Suppir 31.3.2011, 08:09
У меня 8 млн. уникальных ID, у каждого из которых 10 параметров (т.е. 8 млн. строк и 10 столбцов).

Если создать просто хеш с одним из параметров, то хеш занимает 200 Мб оперативки.
Если создать хеш хешей и забить в него один параметр, то он сразу занимает 1000 Мб.
Но зато потом при добавлении других параметров в готовый хеш хешей прирост
занимаемой оперативки небольшой (т.е. не по 200 Мб прибавляет, а по 50 - 100).

Двумерный массив занимает столько же оперативки, что и хеш хешей, но менее удобен. 


Автор: dmitryk1 31.3.2011, 08:50
Вариант сделать ещё так:


Код


$prop{'зарплата'}=1;
$prop{'опыт_работы'}=2;

$user{'Петров'}=1;
$user{'Сидоров'}=2;


$сотрудники{$user{'Петров'}}{$prop{'зарплата'}}=10;
$сотрудники{$user{'Петров'}}{$prop{'опыт_работы'}}=3;
$сотрудники{$user{'Сидоров'}}{$prop{'зарплата'}}=10;
$сотрудники{$user{'Сидоров'}}{$prop{'опыт_работы'}}=3;



А вообще для таких целей не зазорно использовать базу данных, которая пережуёт и больше 2-х гигов.

Автор: infarch 31.3.2011, 09:46
Как раз хотел написать про базу... Действительно, подключите MySQL и не парьтесь с хешами.

Автор: DurRandir 31.3.2011, 13:31
Есть замечательный модуль, Devel::Size, который как раз позволяет проводить такие измерения.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)