| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 395 人关注过本帖
标题:文本超5G,数组过大,运行则秒退
只看楼主 加入收藏
本帖由 静夜思 于 2019-5-5 12:31 审核通过
vinsan
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2019-5-5
结帖率:0
  已结贴   问题点数:20  回复次数:6   
文本超5G,数组过大,运行则秒退
需要处理的文本超过5G,数据输入形成的数组有超过九千万,运行则秒退,请问该如何处理?
warning LNK4084: total image size -1609625600 exceeds max (268435456); image may not run
程序如下:
#include<iostream>
#include<fstream>
#include<string>
using namespace std;

    char s_sta[98297160], s_s_t[98237160];
    int s_num[98297160], depth[98297160];
    float Q[98297160], hh[98297160],ii[98297160],jj[98297160];

    char b_name[44422], b_sta[44422], aa[44422], bb[44422], cc[44422], b_s_t[44422], ff[44422],gg[44422];
    int num[44422], b_c_t[44422];
    float dd[44422],ee[44422];

    char k_name[10000000], k_sta[10000000], k_t[10000000];
    int k_d[10000000];
    float k_Q[10000000];

int main()
{
    fstream fin("土壤水份站近3年逐小时资料.txt",ios::in);//打开输入文件
    fstream precipitation("微量降水B1.txt",ios::in);   
    fstream outfile("B1.txt");// 打开文件
    ofstream lastfile("微量降水(降水总量=3mm)过程中土壤含水量变化分析.txt",ios::trunc|ios::out);// 打开输出文件
    if(!fin)        
    {
        cerr<<"can not open file"<<endl;
        return -1;
    }
    if(!precipitation)        
    {
        cerr<<"can not open file"<<endl;
        return -1;
    }
    if(!outfile)        
    {
        cerr<<"can not open file"<<endl;
        return -1;
    }
    if(!lastfile)        
    {
        cerr<<"can not open file"<<endl;
        return -1;
    }

    int i,j,k;
//输入表1逐日数据
    for(i=0;i<98297161;i++)
    {
        if(i == 0)
            {
                continue;
            }
        fin>>s_sta[i], s_s_t[i], s_num[i], depth[i], Q[i], hh[i], ii[i], jj[i];
        i++;
    }
//输入表2降水数据
    for(j=0;j<44423;j++)
    {
        if(j == 0)
            {
                continue;
            }
            precipitation>>num[j],b_name[j],b_sta[j],aa[j],bb[j],cc[j],b_s_t[j],b_c_t[j],dd[j],ee[j],ff[j],gg[j];
            j++;
                if(j == 10)
            {
                cout << "j==10" << endl;
            }
    }
//输出提取的数据到outfile
    for(j=0;j<44423;j++)
    {
        for(i=0;i<98297161;i++)
        {
            while((b_sta[j] == s_sta[i]) && (b_s_t[j] == s_s_t[i]))
            {
                for(i=i-60;i<=i+500;i++)
                {
                    while((depth[i]==10)||(depth[i]==20)||(depth[i]==30)||(depth[i]==40)||(depth[i]==50)||(depth[i]==60)||(depth[i]==80)||(depth[i]==100))
                    {
                        outfile<<b_name[j]<<s_sta[i]<< s_s_t[i]<< depth[i]<< Q[i]<<endl;
                    }
                    i++;
                }
            }
            break;
        }
        j++;
    }
//对outfile数据整理排序输出到lastfile
    for(k=0;k<10000000;k++)
    {
        outfile>>k_name[k],k_sta[k],k_t[k],k_d[k],k_Q[k];
        k++;
    }
    for(k=0;k<10000000;k=k+8)
    {
        lastfile<<k_name[k]<<k_sta[k]<<k_d[k]<<k_Q[k]<<k_Q[k+1]<<k_Q[k+2]<<k_Q[k+3]<<k_Q[k+4]<<k_Q[k+5]<<k_Q[k+6]<<k_Q[k+7]<<k_Q[k+8]<<k_Q[k+9]<<k_Q[k+10]
            <<k_Q[k+11]<<k_Q[k+12]<<k_Q[k+13]<<k_Q[k+14]<<k_Q[k+15]<<k_Q[k+16]<<k_Q[k+17]<<k_Q[k+18]<<k_Q[k+19]<<k_Q[k+20]<<k_Q[k+21]<<k_Q[k+22]<<k_Q[k+23]
            <<k_Q[k+24]<<k_Q[k+25]<<k_Q[k+26]<<k_Q[k+27]<<endl;
        k=k+8;
    }

    fin.close();
    precipitation.close();
    outfile.close();
    lastfile.close();
    return 0;
}
2019-05-05 12:19
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:300
帖 子:6303
专家分:36611
注 册:2011-1-18
  得分:10 
1. 你的系统支持5G内存吗?

2. fin>>s_sta[i], s_s_t[i], s_num[i], depth[i], Q[i], hh[i], ii[i], jj[i]; 等等应该是写错了吧。下同。


[此贴子已经被作者于2019-5-5 14:13编辑过]

2019-05-05 13:02
vinsan
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2019-5-5
  得分:0 
回复 2楼 rjsp
系统是8G的,应该是支持的,但是就是运行不了
2019-05-05 13:11
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:300
帖 子:6303
专家分:36611
注 册:2011-1-18
  得分:0 
回复 3楼 vinsan
先将代码改正确再试试吧
2019-05-05 14:32
vinsan
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2019-5-5
  得分:0 
回复 4楼 rjsp
改后:fin>>s_sta[i]>> s_s_t[i]>> s_num[i]>> depth[i]>> Q[i]>> hh[i]>> ii[i]>> jj[i];
不知道是否哪里还有错误?
最后一个循环放错了,应该是下面这个:想要将前面提取出一维数组每224个数分一段,分别进行排序输出,这个写法参考的是单个一维数组的分段,我下面的这一段应该是错的,请问应该如何写才对?
    for(k=0;k<10000000;k++)
    {
        outfile>>k_name[k]>>k_sta[k]>>k_t[k]>>k_d[k]>>k_Q[k];
        k++;
    }
    int aaa[224],bbb[224],ccc[224],ddd[224],x,y;
    int loop = 0;
     
    while (loop--)
    {
        int x = 0;
        while (x < 224 && k_name >> aaa[x++] && k_sta >> bbb[x++] && k_d >> ccc[x++] && k_Q >> ddd[x++]);
        for(y=0;y<8;y++)
        {
            lastfile<<k_name[y]<<aaa[y]<<bbb[y]<<ccc[y]<<ddd[y+8]<<ddd[y+16]<<ddd[y+24]<<ddd[y+32]<<ddd[y+40]<<ddd[y+48]<<ddd[y+56]<<ddd[y+64]<<ddd[y+72]<<ddd[y+80]
                <<ddd[y+88]<<ddd[y+96]<<ddd[y+104]<<ddd[y+112]<<ddd[y+120]<<ddd[y+128]<<ddd[y+136]<<ddd[y+144]<<ddd[y+152]<<ddd[y+160]<<ddd[y+168]<<ddd[y+176]<<ddd[y+184]
                <<ddd[y+192]<<ddd[y+200]<<ddd[y+208]<<ddd[y+216]<<endl;
            y=y++;
        }
   }
2019-05-05 16:58
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:300
帖 子:6303
专家分:36611
注 册:2011-1-18
  得分:0 
回复 5楼 vinsan
还有 precipitation>>num[j],b_name[j],b_sta[j],aa[j],bb[j],cc[j],b_s_t[j],b_c_t[j],dd[j],ee[j],ff[j],gg[j];

你最好在全部数据读入后,将所有数据写入到一个文件中,对比一下两个文件,判断是否读取正确。

我不知道你的程序逻辑,帮不了你。我有几个建议
a. 从外部读入的数据要判断,包括格式、行数是否符合要求。
b. 尽量用std::vector,少用 char s_sta[98297160] 等,何况里面还有一个魔法数98297160
c. 如果你确定是文件太大而引发的错误,那么应当重新设计算法,避免必须全部一次性读入。
2019-05-06 08:40
lyb661
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:15
帖 子:45
专家分:78
注 册:2018-12-12
  得分:10 
同意六楼,改为泛型编程,数组容易越界。
2019-05-10 14:05







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.075662 second(s), 9 queries.
Copyright©2004-2019, BCCN.NET, All Rights Reserved