奇怪的malloc行为将不允许在64位进程上分配更多的2GB内存

时间:2013-04-17 19:07:14

标签: c++ linux windows unix memory-management

这个问题与我正在开发的程序有关。

我正在开发一个项目,该项目要求不通过网络发送行集或大于2GB的行(网络不能以大于2GB的组发送数据)。我已对代码进行了所有正确的更改,因此它不会发送此/这些组,但现在我正在尝试构建测试用例。

我已经构建了一个测试,只能创建不到10亿行,占用超过2 GB的行。程序在通过网络发送之前会正确过滤掉这些行。

我遇到的问题是我需要创建一个单行来保存一个列,该列包含一个字符串或一列列,在该行内,包含字符串,此行的大小大于2GB。但是当字符串开始占据接近2GB时,malloc返回NULL

我做了一些研究,发现可能是因为我没有足够的连续内存,所以我开始用更小的字符串添加更多的列。我已经把64个列中的2GB字符串分解,以便它不必一次分配所有内容。我仍然遇到同样的问题,我怀疑我忽略了什么。

这是64位Windows 7系统上的64进程。 8GB的内存。 (但我也在带有24GB RAM的64位红帽机上测试过它)

有没有人了解系统在接近2GB时不会分配程序内存的原因?

P.S。我还研究了每个进程可以在64位系统上分配的内存,它已超过100TB。考虑到它是如此之多,我接近2GB时无法分配的事实让我感到困惑。

1 个答案:

答案 0 :(得分:1)

在对我遇到此问题的大量代码进行了大量探索之后,我注意到传递给calloc(uint_64)的大小是由返回有符号整数的函数计算的。由于此数字溢出,当编译器将其转换为uint_64时,设置了最大的位。这当然导致calloc试图分配大量内存。

当然有几种可能的解决方案:

  1. 将size函数的返回类型更改为uint_32(这对我的代码库和时间限制来说太大了)
  2. 将大小函数的结果转换为uint_32,然后将其传递给calloc(我选择的选项,暂时绕过该大型分配)
  3. 我希望这最终有助于其他人,