关闭

程序的性能与程序员的思维

634人阅读 评论(0) 收藏 举报
又有一段时间没有写blog了, 这段时间在忙着做实验, 写 一些perl的脚本程序, mining一些数据, 其实程序本身并没有什么, 但是刚开始的时候没有认识到, 要处理的数据量很大, 所以性能成为了程序的瓶颈.

我的工作主要是parse一个文本字符串, 将其中一些field 往数据库里面塞, 如果是处理100条这样的串, 那随便怎样都可以了, 读一行文件, 处理一行, 然后往数据库里面insert 一条记录; 如果处理的是 100 万 条数据, 那么就可以处理出1万行, 然后一次性插入数据库, 连着写 一万个 insert into values 的语句. 当然, 如果你嫌慢, 可以这样做, 开辟一个大的缓冲区 buffer1 读数据, 但后处理出来放入 buffer2. 让buffer2 往数据库里面塞. 当然了, 你还可以用多线程来加速这个过程, 如果用的是多核cpu 当然最好了.  如果这样你还觉得慢的话, 就可以用数据库的 bulk insert, 首先将buffer2 写入文件, 然后让数据库bulk insert 这个文件. 请你不要认为写文件会耽搁时间, 实际上 先写入文件再bulk insert 的速度 要比 连着 insert 数据库快 20 倍. 我做过这个实验. 用 C++, C# 插数据库要比 perl 快一些, 大约 perl 是 C++ 的 1.3 倍, 然后内存中一次性插入 多条 记录要比一次一条 快 2倍左右, bulk insert 比 用多条插入 快 20 倍.

所以推荐 大家 在大量的插入数据库的时候 , 可以先写成文件, 然后 一次让数据库批量导入.

可惜我面临的问题不是 100 万, 而是 1 万 个 100 万, 数据库可以 插那么多的记录, 可是如果我要 join 表 或者是 select 什么的, 就会很慢很慢了,  光是数 count 那就简单,  group by 一下就ok了. 如果我还是用bulk insert 的话, 那我再等半年可能数据才能处理完, 到时候都过年咯, 呵呵.

唉, 没办法, 只有考虑用 分布式 的数据库, 可见什么东西, 是有需要才用的, 没有那个必要, 就不会用了.

在此之前, 还写过一个简单的parser , 结果用 C# 实现同样的功能要快 10 倍, 因为我在 perl 的parser 里面加入了一些复杂的 正则表达式, 运算的复杂度很大, 一下子就慢了下来, 结果需要很快的跑出结果, 就需要重新思考.

就我个人经验, 很多时候, 刚开始写一个程序, 可能并没有意识到这个程序将要面临的挑战, 所以往往写完了改, 测试, 反正是总要出点问题才甘心的. 以前总是为了赶任务, 写的快, 现在才发现, 磨刀不误砍柴工啊, 以此提醒程序员兄弟们, 1天写 1万行程序, 其实不算什么的,  关键要看你这个程序 做了一些什么事情.

写好程序之后, 还请多思考思考, 这个程序处理这个问题合适吗? 时间上来的及吗? 还能够优化吗?
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:92628次
    • 积分:2100
    • 等级:
    • 排名:第18145名
    • 原创:122篇
    • 转载:0篇
    • 译文:0篇
    • 评论:16条
    文章分类
    最新评论