我需要为1亿条记录留出多少内存

时间:2013-01-30 22:02:25

标签: memory-management byte

我需要多少内存才能将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

你看到这个计算有什么问题吗?

2 个答案:

答案 0 :(得分:2)

如果你真的只需要每个结构7个字节,那么你几乎正确。

对于内存测量,我们通常使用1024因子,因此您需要

700 000 000 / 1024³ = 667,57 MiB = 0,652 GiB

答案 1 :(得分:2)

拥有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个字节。因此,它可以轻松地达到您所期望的两倍。

其他语言会有不同的开销。最简单的事情可能是根据经验找出:查看系统调用的内容,找出你正在使用多少内存,然后检查这个值,分配一百万个实例,再次检查并查看差异。