这个问题与我正在开发的程序有关。
我正在开发一个项目,该项目要求不通过网络发送行集或大于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时无法分配的事实让我感到困惑。
答案 0 :(得分:1)
在对我遇到此问题的大量代码进行了大量探索之后,我注意到传递给calloc(uint_64)
的大小是由返回有符号整数的函数计算的。由于此数字溢出,当编译器将其转换为uint_64
时,设置了最大的位。这当然导致calloc试图分配大量内存。
当然有几种可能的解决方案:
uint_32
(这对我的代码库和时间限制来说太大了)uint_32
,然后将其传递给calloc(我选择的选项,暂时绕过该大型分配)我希望这最终有助于其他人,
丹