我试图用C代码生成大文件(4-8 GB).
现在我使用fopen()与’wb’参数来打开文件二进制和fwrite()函数for循环将文件写入文件.我在每个循环迭代中写一个字节.直到文件大于或等于4294967296字节(4096 MB)才有问题.它在32位操作系统中看起来像一些内存限制,因为当它写入该打开的文件时,它仍然在RAM中.我对吗?症状是创建的文件的尺寸比我想要的要小.差异是4096 MB,例如当我想要6000 MB文件,它创建6000 MB – 4096 MB = 1904 MB文件.
现在我使用fopen()与’wb’参数来打开文件二进制和fwrite()函数for循环将文件写入文件.我在每个循环迭代中写一个字节.直到文件大于或等于4294967296字节(4096 MB)才有问题.它在32位操作系统中看起来像一些内存限制,因为当它写入该打开的文件时,它仍然在RAM中.我对吗?症状是创建的文件的尺寸比我想要的要小.差异是4096 MB,例如当我想要6000 MB文件,它创建6000 MB – 4096 MB = 1904 MB文件.
你能建议其他方式来做这个任务吗?
问候 :)
部分代码:
unsigned long long int number_of_data = (unsigned int)atoi(argv[1])*1024*1024; //MB char x[1]={atoi(argv[2])}; fp=fopen(strcat(argv[3],".bin"),"wb"); for(i=0;i<number_of_data;i++) { fwrite(x,sizeof(x[0]),fp); } fclose(fp);
解决方法
fwrite不是这里的问题.问题是您正在为number_of_data计算的值.
处理64位整数时,您需要注意任何无意中的32位投射.当我定义它们时,我通常会在一些离散的步骤中执行,每个步骤都要小心:
unsigned long long int number_of_data = atoi(argv[1]); // Should be good for up to 2,147,483,647 MB (2TB) number_of_data *= 1024*1024; // Convert to MB
赋值运算符(* =)将作用于l值(unsigned long long int),因此您可以信任它作为64位值.
这可能看起来没有优化,但一个体面的编译器将删除任何不必要的步骤.