【发布时间】:2021-04-23 11:59:29
【问题描述】:
我在 RAM 中有大量数据,其中每个用户都有几个无符号短(2 字节)值。它们的数量从 0 到 256 不等,但实际情况是我有 1200 万用户只有 1 个值,6M 有 2,3.5M 有 3 等等。最多 1 个用户有 60 个值。
我需要选择一种对内存、访问和修改高效的数据类型。我想为此目的使用向量,但空向量本身的大小是 24 字节。这对我的 RAM 来说太多了。
现在我想使用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
【问题讨论】:
-
如果不玩那些可能会将您推回到
vector内存消耗领域的游戏,就无法做到这一点。您可以为所有人分配最大可能的大小,但这也是一种巨大的浪费。我认为,您将不得不做一些定制的事情。 -
std::array的大小是其类型的一部分,因此您不能将不同大小的数组作为哈希表的一部分。你考虑过std::unique_ptr<unsigned short[]>吗? -
或您自己的类向量,但使用类似 短字符串优化 来避免短向量的堆分配。
-
@user4581301 你能给我一个提示,我可以在哪里开始搜索那个自定义类型。我没有想法
-
@vamirio-chan 您不搜索自定义类型,根据定义您自己编写。考虑一下您需要什么(开销较小的向量)并开始自己编写代码。
标签: c++ arrays caching memory hashmap