免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3286 | 回复: 15

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

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

论坛徽章:
323
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
发表于 2016-03-01 13:19 |显示全部楼层
同时能打开的文件数由操作系统决定

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

论坛徽章:
323
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
发表于 2016-03-01 14:41 |显示全部楼层
titansword2000 发表于 2016-03-01 13:32
楼上的兄弟,现在的问题是这么多点位,总不能通过打开、关闭、再打开这种方法吧,那样效率会低得无法想象啊


windows的限制可以通过改注册表调整。不够fopen本身也有限制,可以用_setmaxstdio调整,貌似上限2048。
所以你还是想办法减小同时打开的文件数吧。

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
发表于 2016-03-01 14:45 |显示全部楼层
放数据库里呗。

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
发表于 2016-03-01 14:45 |显示全部楼层
放数据库里呗。

论坛徽章:
323
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
发表于 2016-03-01 15:01 |显示全部楼层
fender0107401 发表于 2016-03-01 14:45
放数据库里呗。


你净出馊主意

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
发表于 2016-03-01 15:17 |显示全部楼层
hellioncu 发表于 2016-03-01 15:01
你净出馊主意


论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:032015年亚洲杯之中国
日期:2015-04-22 15:52:45
发表于 2016-03-01 15:48 |显示全部楼层
看上去, 最终文件大小也不过2.5G左右.
你直接把数据理出来, 放在内存中, 然后依次建文件写好就是了.
源文件你直接一个记录一个记录地读就是了, 也用不了多少内存...

我家里台式电脑内存都32G了...没错, 我是来炫耀的.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP