免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: titansword2000
打印 上一主题 下一主题

[C] 程序中不能建立新文件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-03-01 11:45 |显示全部楼层 |倒序浏览
描述:处理一个很大的文本文件,2.5G左右,文件行数超过40,000,000,其内容为大约6万个(也可能更多,因为可能随时增加)点位每5分钟的信息,其中可能还存在重复数据,现需按点位及时间顺序将其中的数据写入到单点位文件中,也就是说大约有6万个文件。代码能运行,但在处理到第253个点位时出现“不能建立文件”的错误后程序退出,其代码与运行结果如下。另外,目前采用的方法是建立或以追加方式打开某点位文件后直到2.5G的数据处理完毕才关闭,想请教在这样文件数特别多的情况下该如何提高程序效率?由于点位数很多,C能建立或打开的最大文件数是多少?



相关代码如下:
char **strOutNameReg2;

FILE *fp_OutReg2[71680];


strOutNameReg2=(char **)malloc(71680*sizeof(char *));
for(i=0;i<71680;i++)
        {strOutNameReg2[i]=(char * )malloc(256*sizeof(char));
        }

strcat(strOutNameReg2[i],"_AllElements.txt");
printf("strOutNameReg2[%4d]= %s  iStnNumReg2= %4d\n",i,strOutNameReg2[i],iStnNumReg2);

if((fp_OutReg2[i]=fopen(strOutNameReg2[i],"w+")) == NULL)
        {printf("不能建立文件: %s.\n",strOutNameReg2[i]);
         exit(12);
        }




输出结果:
strOutNameReg2[ 249]= E:\DataOut\Out_Reg\S6833_AllElements.txt  iStnNumReg2=  250
strOutNameReg2[ 250]= E:\DataOut\Out_Reg\S6834_AllElements.txt  iStnNumReg2=  251
strOutNameReg2[ 251]= E:\DataOut\Out_Reg\S6835_AllElements.txt  iStnNumReg2=  252
strOutNameReg2[ 252]= E:\DataOut\Out_Reg\S4051_AllElements.txt  iStnNumReg2=  253
不能建立文件: E:\DataOut\Out_Reg\S4051_AllElements.txt.

论坛徽章:
0
2 [报告]
发表于 2016-03-01 12:50 |显示全部楼层
看的10多个,来个指点的吧。这个地方搞了1天了,还是找不到不能建立文件的原因

论坛徽章:
0
3 [报告]
发表于 2016-03-01 13:32 |显示全部楼层
楼上的兄弟,现在的问题是这么多点位,总不能通过打开、关闭、再打开这种方法吧,那样效率会低得无法想象啊

论坛徽章:
0
4 [报告]
发表于 2016-03-01 16:26 |显示全部楼层
回复 10# hanxin83


    现在使用全部数据放到内存中的办法,但在分配内存时也出现错误。通过Windows的任务查看器观察,发现在内存分配到2073K左右(也就是2G)时程序崩溃,采用malloc函数分配内存,系统为 Server2008 R2,内存16G。

其部分代码如下:
char ***strStnId;

strStnId=(char ***)malloc(71680*sizeof(char **));
..........
for(i=0;i<71680;i++)
        {strStnId=(char **)malloc(288*sizeof(char *));
          .......
         for(j=0;j<288;j++)
                {strStnId[j]=(char *)malloc(7*sizeof(char));
                  ..........
                }
    }

上述代码意思为分配strStnId[71680][288][7]的三维字符串数组。

论坛徽章:
0
5 [报告]
发表于 2016-03-01 16:36 |显示全部楼层
本帖最后由 titansword2000 于 2016-03-01 16:38 编辑

回复 14# hellioncu


    是的,32位程序,但系统是64位的。该如何使用64位编程呢

论坛徽章:
0
6 [报告]
发表于 2016-03-01 16:57 |显示全部楼层
回复 13# fender0107401


    不知道啊,OS为Win 2008 Server R2,默认设置,未对环境做修改
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP