Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > 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, в плане производительности выиграет второй вариант? (один большой хеш хешей) |
Автор: 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 | ||
Вариант сделать ещё так:
А вообще для таких целей не зазорно использовать базу данных, которая пережуёт и больше 2-х гигов. |
Автор: infarch 31.3.2011, 09:46 |
Как раз хотел написать про базу... Действительно, подключите MySQL и не парьтесь с хешами. |
Автор: DurRandir 31.3.2011, 13:31 |
Есть замечательный модуль, Devel::Size, который как раз позволяет проводить такие измерения. |