我正在处理一个从多个文件读入的C程序
每行大约60个字符的行,并在内存中分配字符串
通过在读取文件时请求更多内存。在每个malloc
之后
请求,如果请求更多,则检查函数OOM()
记忆力很成功。
我用越来越大的输入文件测试了程序,并且
当记忆时,OOM()
或多或少会报告"Out of memory"
在程序中查看top
命令时,使用率达到1.2G
在跑。这是在64位的Linux机器上,有更多的内存
可用。 file /my/binary/program
的输出:
ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped
我的问题是:为什么它达到了1.2G的限制?我记得我的 sysadmin曾经说某些二进制文件只能使用 高达1.2G,这恰恰是我在这里看到的。
当我在同一个64位Linux的节点上运行qsub
相同的执行时
SGE网格保留了50GB内存,它报告了"Out of
memory"
以及以下SGE日志内存占用:
Max vmem = 2.313G
为什么程序达到此内存限制的任何想法?有没有 编译标志我应该知道哪些可能导致/解决这个问题?
在下面查找当前Makefile
中的相关标记:
CC = gcc
CFLAGS = -Wall -O3 -funroll-loops -DNDEBUG -fomit-frame-pointer -std=gnu99 -msse2 -Wno-unused-function -Wno-unused-result
CFLAGSSFMT = -msse2 -DHAVE_SSE2 -O9 -finline-functions -fomit-frame-pointer \
-DNDEBUG -fno-strict-aliasing --param max-inline-insns-single=1800 -std=c99
LD = ld
LDFLAGS = -lm -lc -lblas -llapack
INCFLAGS =
DEFINES = -D_GNU_SOURCE -DUSE_BLAS
一些相关代码belo:w
mystring.h
中的:
#ifndef _MYSTRING_H_
#define _MYSTRING_H_
struct __mystring_struct {
char * string;
int len, maxlen;
};
typedef struct __mystring_struct * Mystring;
#define Mystring_size sizeof(struct __mystring_struct)
Mystring new_mystring (const int len);
void free_mystring (Mystring string);
void append_char_to_mystring ( const char c, Mystring string);
char * cstring_of_mystring(const Mystring string);
Mystring mystring_of_cstring (const char * str);
#endif
mystring.c
中的:
#include <string.h>
#include "mystring.h"
#define OOM(A) { if (NULL==(A) ){fputs("Out of memory\n",stderr); exit(EXIT_FAILURE);} }
static void check_is_mystring (const Mystring string);
static void double_length_of_mystring ( Mystring string);
后来:
static void double_length_of_mystring (Mystring string){
char * new_mem;
check_is_mystring(string);
new_mem = malloc(string->maxlen * 2 * sizeof(char)); OOM(new_mem);
memcpy (new_mem,string->string,string->len * sizeof(char));
free(string->string);
string->string = new_mem;
string->maxlen *= 2;
check_is_mystring (string);
}
答案 0 :(得分:6)
您似乎使用int
来保持字符串的大小。在GCC(以及大多数其他PC平台编译器)中,此类型is 32b even on 64b platform。您应该使用size_t
代替。
分配失败的机制如下:
malloc
时,-1717986918被符号扩展到64 b,然后被转换为无符号64b,这给你2 ^ 64 - 1717986918,这只是略低于2 ^ 64,并且肯定更多而不是你在系统中的记忆。