免费注册 查看新帖 |

Chinaunix

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

[C] 写大量小文件的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-01 23:06 |只看该作者 |倒序浏览
各位大侠:

      遇到一个问:
      将数据库表中的数据按行写入不同文件的问题。当前表容量是60几万,每行需要写入到3个不同的文件。
      也就是说需要按行追加180万左右的数据文件。

      当前的实现是先把数据库表数据select出来,按行遍历结果集,依次打开文件,写入数据,关闭文件。
     这个实现在刚开始运行的时候速度还比较快,平均每秒1万条记录,但是遍历到40万左右的数据时,
     速度突然变慢,平均1万条记录所需的时间会到10秒-50秒,用ps查询出来看状态说是wait_o,不知道这是什么问题?
     
      我写文件用的是fprintf,这个效率比fwrite会低很多吗?
      
      我Google了一下,wait_o 好像是wait_on_buffer的意思,这会导致很慢的运行速度吗?
   
      我想过用多进程写文件,但是觉得这也解决不了根本问题,关键是文件写入速度不稳定,没法预测一个比较准确的运行时间。

      该程序是在服务器上跑的,环境是ext2,内存16g,cpu 4核的。


     问题比较多,请教各位大侠了,谢谢!

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
2 [报告]
发表于 2008-11-01 23:27 |只看该作者
Linux通常会利用大量空闲内存做IO的buffer cache,开始数据仅仅是复制到内核buffer cache中,所以很快,buffer cache满了后,瓶颈就在磁盘写入速率了,比开始要慢很多

论坛徽章:
0
3 [报告]
发表于 2008-11-02 16:48 |只看该作者

查看了一下myql中的数据表,数据表大小也就70多m

查看了一下myql中的数据表,数据表大小也就70多m,buffer这么快就用完了么?

另外,如果buffer满了写磁盘,按理将buffer中的数据写入磁盘以后,buffer清空,速度应该再次变快,但是实际情况是速度没有变快,一直很慢。

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
4 [报告]
发表于 2008-11-02 19:10 |只看该作者
使用vmstat命令查看系统buffer cache的变化

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
5 [报告]
发表于 2008-11-02 20:33 |只看该作者
hdparm 优化一下磁盘磁盘访问速度,
优化文件系统参数,使更适合小文件操作(需要重新格式化分区)

论坛徽章:
0
6 [报告]
发表于 2008-11-02 23:52 |只看该作者

回复 #1 lpc002000 的帖子

1、看是不是数据库的问题,比如运行数据库命令时(假设select)变慢了,那就优化下数据库。
2、如果是操作系统问题,那很有可能是IO buffer的问题。
3、如果你想获得准确的时间,好的方法没有,坏的有一个。就是linux写接口里有个写直达的参数,考虑用批量写+写直达。这样会获得准确时间的效果。

论坛徽章:
0
7 [报告]
发表于 2008-11-03 12:04 |只看该作者
原帖由 timespace 于 2008-11-2 19:10 发表
使用vmstat命令查看系统buffer cache的变化

这是vmstat命令的结果:
r  b   swpd   free   buff  cache   si   so    bi    bo   in    cs us sy id wa
0  0    144  23948 345084 11136308    0    0     3    34    0     0  0  1 99  0

观察了一段时间,buff和cache基本不变,free有小的波动,但是变化不大

论坛徽章:
0
8 [报告]
发表于 2008-11-03 12:05 |只看该作者
原帖由 samon_fu 于 2008-11-2 23:52 发表
1、看是不是数据库的问题,比如运行数据库命令时(假设select)变慢了,那就优化下数据库。
2、如果是操作系统问题,那很有可能是IO buffer的问题。
3、如果你想获得准确的时间,好的方法没有,坏的有一个。就 ...



1.整个程序运行过程只有一个select语句。
2.可能是磁盘io的瓶颈吗?

论坛徽章:
0
9 [报告]
发表于 2008-11-03 12:06 |只看该作者
原帖由 yjh777 于 2008-11-2 20:33 发表
hdparm 优化一下磁盘磁盘访问速度,
优化文件系统参数,使更适合小文件操作(需要重新格式化分区)

使用的文件系统是ext2.

使用ext3/reiserfs/xfs可能改善性能吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP