我需要多少内存才能将 1 亿条记录加载到内存中。假设每条记录需要 7 个字节。这是我的计算
each record = <int> <short> <byte>
4 + 2 + 1 = 7 bytes
needed memory in GB = 7 * 100 * 1,000,000 / 1000,000,000 = 0.7 GB
你觉得这个计算有什么问题吗?
我需要多少内存才能将 1 亿条记录加载到内存中。假设每条记录需要 7 个字节。这是我的计算
each record = <int> <short> <byte>
4 + 2 + 1 = 7 bytes
needed memory in GB = 7 * 100 * 1,000,000 / 1000,000,000 = 0.7 GB
你觉得这个计算有什么问题吗?
如果你真的每个结构只需要 7 个字节,那么你几乎是对的。
对于内存测量,我们通常使用 1024 因子,因此您需要
700 000 000 / 1024³ = 667,57 MiB = 0,652 GiB
对于 100,000,000 条记录,您需要考虑开销。确切的开销和开销取决于语言。
例如,在 C/C++ 中,结构或类中的字段对齐到特定的边界。细节可能因编译器而异,但通常 int 必须从 4 的倍数开始,short 必须从 2 的倍数开始,char 可以从任何地方开始。
因此,假设您的 4+2+1 表示一个 int、一个 short 和一个 char,那么如果您按该顺序排列它们,该结构将占用 7 个字节,但至少该结构的下一个实例必须从一个 4 字节的边界,所以中间有 1 个填充字节。我认为,事实上,大多数 C 编译器要求结构作为一个整体从 8 字节边界开始,尽管在这种情况下这并不重要。
每次分配内存时,分配块都会产生一些开销。编译器必须能够跟踪分配了多少内存以及有时下一个块在哪里。如果您将 100,000,000 条记录分配为一个大的“新”或“malloc”,那么这个开销应该是微不足道的。但是,如果您单独分配每个记录,那么每个记录都会产生开销。究竟有多少取决于编译器,但是,让我们看看,我使用的一个系统我认为每个分配是 8 个字节。如果是这种情况,那么每条记录需要 16 个字节:8 个字节用于块头,7 个用于数据,1 个用于填充。所以它很容易达到你期望的两倍。
其他语言会有不同的开销。最简单的做法可能是凭经验找出:查看系统调用是什么,以了解您正在使用多少内存,然后检查该值,分配一百万个实例,再次检查并查看差异。