C语言读取大量文件进行计算栈溢出怎么解决

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言读取大量文件进行计算栈溢出怎么解决相关的知识,希望对你有一定的参考价值。

代码如下,一运行就提示栈溢出,求大神帮忙看一下

#include <stdio.h>
#include <string.h>
#include <math.h>
#define PI 3.14159265
#define FILE_NUM 366

double main()

FILE *fp1[FILE_NUM],*fp2[FILE_NUM],*fp3[FILE_NUM],*fp4[FILE_NUM],*fp5[FILE_NUM],*fp6[FILE_NUM],*fp7,*fp8;
FILE *fw1[FILE_NUM],*fw2[FILE_NUM],*fw3[FILE_NUM];

int i,j,k;
char filename1[30],filename2[30],filename3[30],filename4[30],filename5[30],filename6[30];
char filename11[30],filename12[30],filename13[30],filename14[30];
char lineBuf1[FILE_NUM][1000],lineBuf2[FILE_NUM][1000],lineBuf3[FILE_NUM][1000],lineBuf4[FILE_NUM][1000],lineBuf5[FILE_NUM][1000],lineBuf6[FILE_NUM][1000];
double a,b;
double Tmax,Tmin,Tave,Wind,Wind2,Air,Lati,Dem,Sun,Vrh,Prp,MI;
double delta,gamma,DT,PT,TT,eTmax,eTmin,es,ea,deltas,phi,omega,Ra,Sunx,Rs,Rs0,Rns,Rnl,Rn,Rng,ETard,ETwind,ET0,deltas1;
double sigma=0.000000004903;

for (i=0;i<FILE_NUM;i++)

sprintf(filename1,"tmx1980%03d.asc",i+1);
sprintf(filename2,"tmn1980%03d.asc",i+1);
sprintf(filename3,"win1980%03d.asc",i+1);
sprintf(filename4,"air1980%03d.asc",i+1);
sprintf(filename5,"sun1980%03d.asc",i+1);
sprintf(filename6,"vrh1980%03d.asc",i+1);*/

sprintf(filename11,"ETO1980%03d.asc",i+1);
/*sprintf(filename12,"EA1980%03d.asc",i+1);
sprintf(filename13,"Rs1980%03d.asc",i+1);

fp1[i]=fopen(filename1,"r");
fp2[i]=fopen(filename2,"r");
/*fp3[i]=fopen(filename3,"r");
fp4[i]=fopen(filename4,"r");
fp5[i]=fopen(filename5,"r");
fp6[i]=fopen(filename6,"r");
fp7=fopen("LRBDEM.asc","r");
fp8=fopen("LRBLatitude.asc","r");*/

fw1[i]=fopen(filename11,"w");
/*fw2[i]=fopen(filename12,"w");
fw3[i]=fopen(filename13,"w");*/

for (j=0;j<6;j++)

fgets(lineBuf1[i],1000,fp1[i]);
fgets(lineBuf2[i],1000,fp2[i]);
fgets(lineBuf3[i],1000,fp3[i]);
fgets(lineBuf4[i],1000,fp4[i]);
fgets(lineBuf5[i],1000,fp5[i]);
fgets(lineBuf6[i],1000,fp6[i]);


for (j=0;j<277;j++)

for (k=0;k<128;k++)

fscanf(fp1[i],"%lf",&Tmax);
fscanf(fp2[i],"%lf",&Tmin);
/*fscanf(fp3[i],"%lf",&Wind);
fscanf(fp4[i],"%lf",&Air);
fscanf(fp5[i],"%lf",&Sun);
fscanf(fp6[i],"%lf",&Vrh);
fscanf(fp7,"%lf",&Dem);
fscanf(fp8,"%lf",&Lat);*/

字数超了,中间计算过程省略了

char tmp1[10];
sprintf(tmp1,"%11.4lf",ET0);
fwrite(tmp1,strlen(tmp1),1,fw1[i]);

fwrite("\n",1,1,fw1[i]);

fclose(fp1[i]);
fclose(fp2[i]);

return 0;

参考技术A 使用堆空间,所有指针、内存都从堆上分配,只要你主机内存够,就不会溢出!

java栈内存溢出怎么解决

第一对所有的代码包括页面中的java代码都进行一遍彻底的回顾检查,
1.对那些静态(static)的对象要特别留神,特别是类型为Map,List,Set的,静态的变量会一直驻存在内存中,生命周期比较长,不会被垃圾器回收。
2.对于代码,要审查是否生成了大量的冗余的对象,还有一些逻辑业务处理的类,
算法是否过于复杂,调整算法,对于代码认真审查,再仔细重构一遍代码,能提高代码质量,提高程序运行稳定性。
3.Java中的内存溢出大都是因为栈中的变量太多了。其实内存有的是。建议不用的尽量设成null以便回收,多用局部变量,少用成员变量。
1),变量所包含的对象体积较大,占用内存较多。
2),变量所包含的对象生命周期较长。
3),变量所包含的对象数据稳定。
4),该类的对象实例有对该变量所包含的对象的共享需求。
4.在我的程序中对静态变量的优化后,使程序占用内存量至少提升了5k-10k。所以也不容忽视。
第二还有就是String类相关的东西:
1.字符串累加的时候一定要用StringBuffer的append方法,不要使用+操作符连接两个字符串。差别很大。而且在循环或某些重复执行的动作中不要去创建String对象,因为String对象是要用StringBuffer对象来处理的,一个String对象应该是产生了 3个对象(大概是这样:))。
2.字符串length()方法来取得字符串长度的时候不要把length放到循环中,可以在循环外面对其取值。(包括vector的size方法)。特别是循环次数多的时候,尽量把length放到循环外面。
int size = xmlVector.size();
for (int i = 2; i < size; i++)
。。。

3 写代码的时候处理内存溢出
try
//do sth
....
catch (outofmemoryerror e)//可以用一个共通函数来执行.
system.out.print (“no memory! ”);
system.gc();
//do sth again
....

4.对于频繁申请内存和释放内存的操作,还是自己控制一下比较好,但是System.gc()的方法不一定适用,最好使用finallize强制执行或者写自己的finallize方法。 Java 中并不保证每次调用该方法就一定能够启动垃圾收集,它只不过会向JVM发出这样一个申请,到底是否真正执行垃圾收集,一切都是个未知数。
参考技术A 栈内存溢出的原因一般有以下几种:
一)、是否有递归调用
二)、是否有大量循环或死循环
三)、全局变量是否过多
四)、 数组、List、map数据是否过大
五)使用DDMS工具进行查找大概出现栈溢出的位置
最好能把代码贴出看一下,如果对你有帮助请及时采纳

以上是关于C语言读取大量文件进行计算栈溢出怎么解决的主要内容,如果未能解决你的问题,请参考以下文章

java 向数据库添加大量数据时内存溢出 在不改变内存的情况下如何解决

C语言中,如何实现从文件中读取数据(大量的数据)后,在循环体中使用,每次传递3个值到数组。

java栈内存溢出怎么解决

java程序内存溢出一般啥原因

POI大量数据读取内存溢出分析及解决方案

POI大量数据读取内存溢出分析及解决方案