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

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

我已经建立了一个测试,该测试创建的行少于10亿行,占用的容量超过2 GB。在通过网络发送这些行之前,程序会正确过滤掉这些行。

我遇到的问题是,我需要创建一个单行,该行将容纳一个包含单个字符串的列,或者在该行内容纳包含字符串的列的集合,该行的大小大于2GB。但是,当字符串开始占据靠近2GB的位置时,malloc返回NULL

我进行了一些研究,发现可能是因为我的连续内存不足,所以我开始添加更多带有较小字符串的列。我已经尽力将2GB字符串分成64列,这样它就不必一次分配太多。我仍然遇到相同的问题,并且我怀疑自己正在忽略某些东西。

它是64位Windows 7系统上的64进程。
8GB的RAM。 (但是我也已经在具有24GB RAM的64位Red Hat计算机上对其进行了测试)

是否有人对为什么系统在接近2GB时不分配程序内存有任何见解?

附言我还调查了每个进程可以在64位系统上分配的内存,它超过了100TB。考虑到这么多,当我接近2GB时我无法分配的事实确实使我感到困惑。

最佳答案

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

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

  • 将size函数的返回类型更改为uint_32(对于我的代码库和时间限制,这可能太大了)
  • 将大小函数的结果转换为uint_32,然后再传递给calloc(我选择的选项,暂时绕过该大分配)

  • 我希望这最终会帮助别人,

    09-06 16:46