免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3500 | 回复: 12
打印 上一主题 下一主题

[C] 请教问题:大文件处理 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-12-04 10:45 |只看该作者 |倒序浏览
本帖最后由 想尼尼 于 2013-12-04 11:03 编辑

问题:
C语言
需要处理N个大文件,size有可能很大,但是大小上限不能具体知道。
需要并行处理文件。
文件的内容有可能涉及到解码什么的,文件格式是多种格式嵌套。

我一开始用了2个方法:
<1>先声明一个超大数组,一次性读完文件。问题是太浪费内存,因为文件有可能是很小的。
<2>用malloc动态分配一个文件大小的space。问题是频繁的动态分配,会造成过多的内存碎片,不适合长时间的运行。
C++好像有内部内存管理的类string,但是C++不太拿出手。。。。
哪位大神帮忙想想办法。

还忘记说了一种:内存映射,
优点:
1、从内存映像文件中读写,避免了read、write多余的拷贝。
2、从内存映像文件中读写,避免了多余的系统调用和用户-内核模式的切换
3、可以多个进程共享内存映像文件。
4、seeking内存映像只需要指针操作,避免系统调用lseek。
缺点:
1、内存映像需要时整数倍页大小,如果文件较小,会浪费内存。
2、内存映像需要在放在进程地址空间,大的内存映像可能导致地址空间碎片,找不到足够大的空余连续区域供其它用。
3、内核需要维护更多的和内存映像相关的数据结构。
貌似和malloc的缺点有点类似

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
2 [报告]
发表于 2013-12-04 10:48 |只看该作者
……你甚至可以用每次只读一个字节的方式,处理一个1T大小的文件。

复习下基础知识吧。

论坛徽章:
0
3 [报告]
发表于 2013-12-04 10:51 |只看该作者
频繁IO太慢吧

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
4 [报告]
发表于 2013-12-04 10:51 |只看该作者
还能“声明一个超大数组,一次性读完文件”或“用malloc动态分配一个文件大小的space”,说明你这个文件极小。

对于你的问题,为什么要一次性读到内存中呢?完全可以用到哪里才去读哪里。
比如现在的电影文件,一般都是20G左右,在我一台2G内存的电脑上就可以完美播放,肯定不是一次性读进内存,因为没那么大的内存。

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
5 [报告]
发表于 2013-12-04 10:58 |只看该作者
想尼尼 发表于 2013-12-04 10:51
频繁IO太慢吧


脑筋太死……既然每次一个字节、处理1T的文件都可以,有人禁止你用每次处理1K甚至1M的数据的方式、处理1G的文件吗?

论坛徽章:
0
6 [报告]
发表于 2013-12-04 10:58 |只看该作者
回复 4# bruceteen
我需要从头到尾都解析的,格式复杂,不太好截取部分
我还忘记说了“内存映射”, 不知道这个方法有什么缺点,我再查查


   

论坛徽章:
0
7 [报告]
发表于 2013-12-04 11:00 |只看该作者
回复 6# 想尼尼
关键这个文件格式有点复杂,不好确定前面的是否是部分完整的可以解析的格式,求指点


   

论坛徽章:
324
射手座
日期: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
8 [报告]
发表于 2013-12-04 11:36 |只看该作者
内存映射是王道,如果是32位程序地址空间受限,可以映射文件的一部分

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
9 [报告]
发表于 2013-12-04 12:56 |只看该作者
一个定长4KB的buffer,一次读4KB。

一个string,读的buffer要append到string尾部,然后立即解析文件内容,解析完的的部分erase掉。

论坛徽章:
0
10 [报告]
发表于 2013-12-04 13:11 |只看该作者
N有多大?
文件一般有多大?
格式有多复杂?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP