C 缓冲区空!:无法分配内存
我已经写了一个程序,将MB作为3个参数,并给我吞吐量时间C 缓冲区空!:无法分配内存,c,C,我已经写了一个程序,将MB作为3个参数,并给我吞吐量时间 int main(int argc,char* argv[]){ double kb = 0; int time_taken = 0; double throughput = 0; int i = 0; int w_rw = 0; int fd = -1; int bw = -1; unsigned long long nob = 0; char ip; char* file_name = "myfile"; cha
int main(int argc,char* argv[]){
double kb = 0;
int time_taken = 0;
double throughput = 0;
int i = 0;
int w_rw = 0;
int fd = -1;
int bw = -1;
unsigned long long nob = 0;
char ip;
char* file_name = "myfile";
char* buff;
struct stat info;
struct timeval start_time,end_time;
int mb = 1024 * 1024;
/* Check the nos for W/RW and MBs*/
if(1 == argc){
printf("\n Missing 2 params R/RW & MB,Eg: execute ./a.out 2 100 \n");
return 1;
}
if(argc < 4){
w_rw = atoi(argv[1]);
if(w_rw > 2){
w_rw = 2;
}
nob = (atoi(argv[2]) * mb);
printf("\n W/RW : %d BYTES : %u \n",w_rw,nob);
}
else{
// Do Nothing
}
/* Allocate Buffer */
buff = (char *)malloc(nob * sizeof(char));
if(NULL == buff){
perror("Buffer NULL!");
return -1;
}
printf("\n File - Create,Open,Write,Close \n");
for(i = 0; i < w_rw; i++){
if(i == 0){
printf("\n --- Write IO Performance--- \n");
}
else{
printf("\n --- Re-write IO Performance--- \n");
printf("\n Press any char to continue : \n");
ip = getchar();
}
/* Open file*/
if((fd = open(file_name,O_CREAT | O_RDWR))< 0){
perror("Open failed!");
return -1;
}
/*Calculating the start and end time of write*/
gettimeofday(&start_time,NULL);
if((bw = write(fd,buff,nob)) < 0){
perror("Write failed!");
return -1;
}
gettimeofday(&end_time,NULL);
/*Calculating the throughput*/
time_taken = (end_time.tv_sec - start_time.tv_sec);
kb = bw/1024;
throughput = kb/time_taken;
/* Start */
if(-1 == stat(file_name,&info)){
perror("STAT Failed");
return -1;
}
printf("\n Inode no: %d \n Blocks : %d \n",info.st_ino,info.st_blocks);
printf("\n Start sec : %u \n",start_time.tv_sec);
printf("\n End sec : %u \n",end_time.tv_sec);
printf("\n Bytes written : %d bytes \n",bw);
printf("\n Time_taken : %d secs \n",time_taken);
printf("\n Throughput : %f kb/sec \n",throughput);
close(fd);
}
unlink(file_name);
return 0;
}
intmain(intargc,char*argv[]){
双kb=0;
int time_take=0;
双吞吐量=0;
int i=0;
int w_rw=0;
int-fd=-1;
int bw=-1;
无符号长nob=0;
字符ip;
char*file_name=“myfile”;
字符*浅黄色;
结构统计信息;
结构时间值开始时间、结束时间;
int mb=1024*1024;
/*检查带RW和MBs的编号*/
如果(1==argc){
printf(“\n缺少2个参数R/RW&MB,例如:execute./a.out 2 100\n”);
返回1;
}
如果(argc<4){
w_rw=atoi(argv[1]);
如果(w_rw>2){
w_rw=2;
}
nob=(atoi(argv[2])*mb);
printf(“\n W/RW:%d字节:%u\n”,W\u RW,nob);
}
否则{
//无所事事
}
/*分配缓冲区*/
buff=(char*)malloc(nob*sizeof(char));
if(NULL==buff){
perror(“缓冲区空!”);
返回-1;
}
printf(“\n文件-创建、打开、写入、关闭\n”);
对于(i=0;i
O/p:
[root@rwgfs]#/a.输出276800
W/RW:2字节:322225472
缓冲区空!:无法分配内存您正在请求一个巨大的内存块(78GB!),而malloc
失败,这与任何标准(台式机/笔记本电脑)上的预期一样
事实上,你有:
int mb = 1024 * 1024;
// ...
nob = (atoi(argv[2]) * mb);
// ...
buff = (char *)malloc(nob * sizeof(char));
因此,在您的情况下,nob
是1024*1024*76800
尝试使用较小的大小,它会工作。取决于您的系统。最好使用
size\u t
处理与分配有关的任何内容。此外,不要使用malloc
:您是否尝试购买80GB的RAM?但我需要使用大约100G的较大大小进行测试。我有2TB容量的文件系统。为什么我不能创造这么大的尺寸?无符号整数和有符号整数不重要。关键是您需要78GB的RAM。我强烈怀疑您的RAM是否超过78GB,或者您的计算机是否可以处理78G的虚拟内存。您可以通过分配一个缓冲区来实现您的目标,该缓冲区的大小是请求的缓冲区的合理子倍数(例如32MB),然后使用for
循环将其写入n
次。