Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 缓冲区空!:无法分配内存_C - Fatal编程技术网

C 缓冲区空!:无法分配内存

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

我已经写了一个程序,将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";
 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
次。