#c #arrays #caching #memory #hashmap
#c #массивы #кэширование #память #hashmap
Вопрос:
У меня есть большие данные в ОЗУ, где для каждого пользователя есть несколько коротких (2 байта) значений без знака. Их количество варьируется от 0 до 256, но реальный случай таков, что у меня 12 миллионов пользователей только с 1 значением, 6 МИЛЛИОНОВ с 2, 3,5 миллиона с 3 и т. Д. До 1 пользователя с 60 значениями.
Мне нужно выбрать тип данных, который был бы эффективным для памяти, доступа и модификации. Я хотел использовать vector для такой цели, но размер самого пустого вектора составляет 24 байта. Это слишком много для моей оперативной памяти.
Теперь я хочу использовать std::array<> , потому что он не выделяет никаких дополнительных байтов, кроме пространства для данных внутри, т.е.
sizeof(std::array<unsigned short, 3>) // 6UL
sizeof(std::vector<unsigned short>) sizeof(unsigned short) * v.capacity() // 24UL 6UL
Проблема в том, что std::array должен указывать размер во время компиляции. Как вы могли догадаться, я не могу этого сделать. Есть ли обходной путь?Я храню своих пользователей в hast_table<unsigned int, T> . Могу ли я, например, хранить массивы с разным размером для каждого ключа?
Комментарии:
1. Невозможно обойтись без игр, которые, вероятно, заставят вас вернуться на
vector
территорию потребления памяти. Вы могли бы выделить максимально возможный размер для всех, но это также огромная трата. Я думаю, вам придется сделать что-то нестандартное.2. Размер a
std::array
является частью его типа, поэтому вы не можете иметь массивы разного размера как часть хэш-таблицы. Вы рассматривалиstd::unique_ptr<unsigned short[]>
?3. Или ваш собственный векторный класс, но с чем-то вроде оптимизации коротких строк , чтобы избежать выделения кучи для коротких векторов.
4. @user4581301 можете ли вы дать мне подсказку, где я могу начать поиск этого пользовательского типа. У меня нет идей
5. @vamirio-chan Вы не ищете пользовательский тип, по определению вы пишете его самостоятельно. Подумайте о том, что вам нужно (вектор с меньшими накладными расходами) и начните кодировать его самостоятельно.
Ответ №1:
Нет. Я боюсь, что это не работает с другим размером!
Комментарии:
1. Хотя это верно, запрашивающий не может иметь разные размеры
array
s, будут обходные пути.