3

这个问题涉及我正在开发的一个程序。

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

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

我遇到的问题是我需要创建一个单行,该行将包含具有单个字符串的列或列集合,在该行内,该行包含字符串,其中该行的大小大于2GB. 但是当字符串开始占用接近 时2GB,malloc 返回NULL

我做了一些研究,发现这可能是因为我没有足够的连续内存,所以我开始添加更多带有更小字符串的列。我已经将2GB字符串拆分为 64 列,这样它就不必一次分配那么多。我仍然遇到同样的问题,我开始怀疑我忽略了一些东西。

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

有没有人知道为什么系统在接近时不会分配程序内存2GB

PS 我还查看了每个进程可以在 64 位系统上分配的内存,它已经结束了100TB。考虑到这么多,当我接近 2GB 时我无法分配的事实真的让我感到困惑。

4

1 回答 1

1

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

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

  1. 将 size 函数的返回类型更改为uint_32(这对我的代码库和时间限制来说太大了)
  2. 在将 size 函数的结果uint_32传递给 calloc 之前将其转换为(我选择的选项,以暂时绕过该大分配)

我希望这最终对其他人有所帮助,

于 2013-05-07T12:42:51.227 回答