免费注册 查看新帖 |

Chinaunix

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

请教个读写文件的问题 我这种情况 如何减少io [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-17 00:11 |只看该作者 |倒序浏览
最近开始学习C++ 工作中需要修改一个别人写的东西

大概是这样

有种文件 一行就是一条完整信息 有多个字段 其中一个是时间 另一个是类型 每个文件大概2000行吧。

例如有文件 20090110100000.txt
文件的排列是无序 例如第一行是 A 类型 时间是 2009-01-10 10:00:00 下一行 就是 B 类型 2009-01-10 09:45:00  再下可能就是B 2009-01-10 10:05:00 了 接着还可能是C 时间又跑前边去了。

就是说 一共有3个类型 A B C  时间则分布在该文件名称的前后各15分钟区间内 无序但是符合范围 现在要 5分钟一个段 拆分出来 3种类型 每种6个段。
就是说 我要把文件拆到 3*6 个文件中去
例如 A200901100945.TXT,A200901100950.TXT A200901100955.TXT A200901101000.TXT A200901101005.TXT A200901101010.TXT
  b  c  同样

原先的写法的 每处理一个文件 打开后 就open 3*6 个目标文件
读一行后 判断出来该是什么类型 去哪个文件 就用 fprintf 方法写 这样倒是省事了 但是io很大

我想把读出来的每行 先放到一个缓存了 然后到一定数量再写一回IO,但是可能就要建立 6*3 个缓存 例如 char[1024] 这样的 来存放每种数据

每个还要缓存对应相应的 文件名 以到最后判断写到哪个文件中 我都开始考虑是否要用个map之类的容器把 文件名 和 缓存 建立个映射
回头每读完一行 判断出哪个文件后 就去map找缓存 写入。

但是总觉得这个方法很不好。

后来看到了fwrite 觉得是否 直接吧原来的 fprintf 方法替换掉 直接使用 fwrite 把里边的buffer设置大些 也有类似的效果?

我这里面临的最大问题就是 每读一行 该写入的缓存都是不定的 每次都要重新判断去找18个中的哪个

fwrite 是否是缓存存到一定的大小才会写硬盘呢?

例如 我读第一个行 要写到 a 10点00 的那个文件去 使用fwrite写 但是现在buffer不满 那么fwrite就先不写io
     下一行 是 c 10点15 那就写到另外一个缓存去。
假如第3行 又变成  a 10点00 的了 此时fwrite的buffer满了 于是此时才连同第一次的一起IO 写入文件

fwrite 能达到这个效果吗?如果不能 回到我原来的想法 该使用个什么容器吗 搞个映射吗?

求高人指点 谢谢~

[ 本帖最后由 oov 于 2009-1-17 00:14 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-01-17 00:20 |只看该作者
fwrite本身就有缓存功能的

论坛徽章:
0
3 [报告]
发表于 2009-01-17 10:23 |只看该作者
标准IO库函数都是带BUFFER的,不用瞎折腾。
大不了用setvbuf(3)手工设置一个更大的BUFFER。

论坛徽章:
0
4 [报告]
发表于 2009-01-18 03:05 |只看该作者
如果文件不是很大的话,应该可以mmap到内存中。
以前也有人直接把整个文件读入内存中的,但是这两种方法都不建议,不是很负责任。

论坛徽章:
0
5 [报告]
发表于 2009-01-18 11:59 |只看该作者

回复 #3 JohnBull 的帖子

呵呵 有理
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP