![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
Suppir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
вариант 1:
$зарплата{'Иванов'}=10; $зарплата{'Петров'}=15; $зарплата{'Сидоров'}=20; $опыт_работы{'Иванов'}=3; $опыт_работы{'Петров'}=5; $опыт_работы{'Сидоров'}=10; вариант 2: $сотрудники{'Иванов'}{'зарплата'}=10; $сотрудники{'Иванов'}{'опыт работы'}=3; $сотрудники{'Петров'}{'зарплата'}=15; $сотрудники{'Петров'}{'опыт работы'}=5; $сотрудники{'Сидоров'}{'зарплата'}=20; $сотрудники{'Сидоров'}{'опыт работы'}=10; Всего около 10 параметров (зарплата, опыт работы, возраст и т.п). и 8 млн. уникальных сотрудников. Какой вариант хеша будет занимать меньше оперативной памяти? |
|||
|
||||
vivu |
|
|||
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 3.11.2009 Репутация: нет Всего: нет |
по моему занимаемый объём оперативы должен быть одинаковый или во втором варианте чуть меньше
|
|||
|
||||
Suppir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
В первом случае создается 10 хешей (по количеству свойств) с 8 млн. пар ключ/значение.
Во втором случае создается 1 сложный хеш с 80 млн. пар ключ/значение. Я, вот, думаю, можно ли как-то оптимизировать создание такой структуры, потому что для быстрых расчетов необходимо засунуть ее в оперативку, но 2 Гб не хватает :( |
|||
|
||||
arto |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
попробуйте переформулировать задачу.
|
|||
|
||||
infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
А не сделать ли 10 параметров массивом? Если они точно известны, может не стоит хешировать?
|
|||
|
||||
KSURi |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 887 Регистрация: 8.6.2006 Где: Russia Репутация: 20 Всего: 27 |
Одинаково.
-------------------- Died at Life.pl line 21 |
|||
|
||||
infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
с точки зрения памяти может и одинаково, а вот производительность однозначно выиграет, не придется считать лишние хеш суммы.
|
|||
|
||||
Suppir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
infarch,
в плане производительности выиграет второй вариант? (один большой хеш хешей) |
|||
|
||||
ZibSoft |
|
|||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 14.10.2006 Репутация: нет Всего: нет |
||||
|
||||
Suppir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
По моим замерам получилось, что первый вариант (10 хешей по 8 млн. пар) занимает меньше оперативки.
Сколько занимает второй вариант, так и не удалось узнать, потому что Perl вылетал с "out of memory" на 70 - 80% пути. |
|||
|
||||
Suppir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
Еще выяснил такой момент:
хеш хешей вида $h{цифровой ID}{параметр}=значение занимает ровно столько же оперативки, как и двумерный массив $a[цифровой ID][параметр] = значение |
|||
|
||||
KSURi |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 887 Регистрация: 8.6.2006 Где: Russia Репутация: 20 Всего: 27 |
Что-то я не так сделал в первый раз, оказывается и правда первый вариант занимает места меньше, чем второй.
Если вы начинаете считать байты, то используйте соответствующий инструмент. В перле даже undef занимает от 12 до 16 байт. -------------------- Died at Life.pl line 21 |
|||
|
||||
Suppir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
У меня 8 млн. уникальных ID, у каждого из которых 10 параметров (т.е. 8 млн. строк и 10 столбцов).
Если создать просто хеш с одним из параметров, то хеш занимает 200 Мб оперативки. Если создать хеш хешей и забить в него один параметр, то он сразу занимает 1000 Мб. Но зато потом при добавлении других параметров в готовый хеш хешей прирост занимаемой оперативки небольшой (т.е. не по 200 Мб прибавляет, а по 50 - 100). Двумерный массив занимает столько же оперативки, что и хеш хешей, но менее удобен. Это сообщение отредактировал(а) Suppir - 31.3.2011, 08:10 |
|||
|
||||
dmitryk1 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 118 Регистрация: 10.6.2008 Где: Новосибирск Репутация: 2 Всего: 2 |
Вариант сделать ещё так:
А вообще для таких целей не зазорно использовать базу данных, которая пережуёт и больше 2-х гигов. |
|||
|
||||
infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
Как раз хотел написать про базу... Действительно, подключите MySQL и не парьтесь с хешами.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |