Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Какой хеш будет меньше занимать оперативки? 
:(
    Опции темы
Suppir
Дата 28.3.2011, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



вариант 1:

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


вариант 2:

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


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

 
PM MAIL   Вверх
vivu
Дата 28.3.2011, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



по моему занимаемый объём оперативы должен быть одинаковый или во втором варианте чуть меньше
PM MAIL   Вверх
Suppir
Дата 29.3.2011, 08:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

Я, вот, думаю, можно ли как-то оптимизировать создание такой структуры, потому что для быстрых расчетов необходимо засунуть ее в оперативку, но 2 Гб не хватает :(
PM MAIL   Вверх
arto
Дата 29.3.2011, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



попробуйте переформулировать задачу.
PM MAIL ICQ   Вверх
infarch
Дата 29.3.2011, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А не сделать ли 10 параметров массивом? Если они точно известны, может не стоит хешировать?
PM MAIL   Вверх
KSURi
Дата 29.3.2011, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Одинаково.


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
infarch
Дата 30.3.2011, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



с точки зрения памяти может и одинаково, а вот производительность однозначно выиграет, не придется считать лишние хеш суммы.
PM MAIL   Вверх
Suppir
Дата 30.3.2011, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



infarch

в плане производительности выиграет второй вариант? (один большой хеш хешей)
PM MAIL   Вверх
ZibSoft
Дата 30.3.2011, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

в плане экономии ресурсов и производительности выгоднее массив (массив массивов).
что касается хешей не знаю, но я бы отдал предпочтения первому - структура проще.
PM MAIL WWW   Вверх
Suppir
Дата 30.3.2011, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



По моим замерам получилось, что первый вариант (10 хешей по 8 млн. пар) занимает меньше оперативки.
Сколько занимает второй вариант, так и не удалось узнать, потому что Perl вылетал с "out of memory" на 70 - 80% пути.
PM MAIL   Вверх
Suppir
Дата 30.3.2011, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Еще выяснил такой момент:

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

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

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

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




PM MAIL   Вверх
KSURi
Дата 31.3.2011, 02:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

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


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
Suppir
Дата 31.3.2011, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

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

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



Это сообщение отредактировал(а) Suppir - 31.3.2011, 08:10
PM MAIL   Вверх
dmitryk1
Дата 31.3.2011, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вариант сделать ещё так:


Код


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

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


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



А вообще для таких целей не зазорно использовать базу данных, которая пережуёт и больше 2-х гигов.
PM MAIL GTalk Jabber   Вверх
infarch
Дата 31.3.2011, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Как раз хотел написать про базу... Действительно, подключите MySQL и не парьтесь с хешами.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

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


 




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


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

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