我的 python 脚本执行时间长了,他就卡着不动,好久才动一次 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qq2549112
V2EX    问与答

我的 python 脚本执行时间长了,他就卡着不动,好久才动一次

  •  
  •   qq2549112 2015-07-05 01:58:39 +08:00 7744 次点击
    这是一个创建于 3830 天前的主题,其中的信息可能已经有所发展或是发生改变。

    写了个脚本, 用来拉取远程服务器上的数据,然后存入本地,

    然后我 执行 python get1.py

    拉取了才5w多

    脚本就卡了 不动

    要好几分钟才动一下

    我以为是远程数据库挂了,于是新开一个窗口执行 python get1.py 速度飞快

    那就正面 不是远程 和本地数据库的问题

    是终端窗口 内存用光了吗

    可是我的脚本 就是要让他长期运行呀,这才拉了几万个记录,就卡成这样了

    那我有好几十万的数据量 怎么办呀

    大家有解决办法吗

    第 1 条附言    2015-07-05 12:19:40 +08:00
    我的核心代码 贴在这里的 http://paste.ubuntu.com/11824534/
    第 2 条附言    2015-07-05 12:22:40 +08:00
    我的代码是这个 http://paste.ubuntu.com/11824534/


    从代码上来看 应该是没有问题 ,后来我加了个判断, 就是offset 可以整除10000的时候 就休息10秒 [也就是每次同步1w个数据,就休息10秒] , 但还是不行,还是会在5w左右的数据量 出现卡住的情况

    而且每次都在 5w左右 卡住

    所以我现在怀疑是远程数据库 做了什么限制

    但是我不知道怎么办了
    第 3 条附言    2015-07-05 12:25:19 +08:00
    会不会是mysql 对每个会话的数据量 做了什么限制啊
    第 4 条附言    2015-07-05 12:35:10 +08:00
    刚才查看了 mysql rds 后台的数据

    他对 IOPS 限制到200的 刚才我看他已经 用了100% 也就是用光了

    是不是这个用光了啊

    不过
    我每秒也没有到200次啊啊


    现在我测试了 超市10秒, 再看看 ,10秒没有反映 是不是会重新连接

    期待上帝保佑
    第 5 条附言    2015-07-05 15:14:14 +08:00
    现在我差不多找到问题原因了


    是 因为 到了 5w左右

    sql语句变成了


    SELECT * FROM table ORDER BY modified ASC LIMIT 52600,100

    我网上搜了,说这样的话, 数据库会扫描52600行数据,所以慢,
    我参考的文章是 http://www.fienda.com/archives/110

    但是我这个 是根据时间戳来 拉数据的, 所以 不能用id 来排除

    我要想想 怎么用时间戳 缩小范围
    第 6 条附言    2015-07-05 16:09:25 +08:00
    [结贴]


    谢谢大家

    现在我找到问题所在了,
    是数据库的问题
    我重新发了个帖子, http://www.v2ex.com/t/203463


    麻烦 懂mysql的朋友 帮我看看 谢谢
    17 条回复    2015-07-05 16:08:52 +08:00
    qq2549112
        1
    qq2549112  
    OP
       2015-07-05 02:23:07 +08:00
    经过简单排查, 发现是 查询语句 获取结果 速度很慢

    查询 到了5w多, 继续查询的话,获取数据的时间会很长, 应该不可能是网络问题

    因为我新开终端 再次运行这个脚本,他跑的很快

    我猜测,是不是远程数据库 因为 这个连接查询的数据量太多了,所以 需要休息 太累了
    20015jjw
        2
    20015jjw  
       2015-07-05 03:11:18 +08:00 via Android   1
    试试查询的时候给一个timeout呢
    Gandum
        3
    Gandum  
       2015-07-05 06:45:32 +08:00 via iPad   1
    上代码
    kenken
        4
    kenken  
       2015-07-05 07:37:06 +08:00   1
    talk is cheap, show me the code
    qq2549112
        5
    qq2549112  
    OP
       2015-07-05 12:22:28 +08:00
    @Gandum
    @kenken
    谢谢
    我的代码是这个 http://paste.ubuntu.com/11824534/ 从代码上来看 应该是没有问题 ,后来我加了个判断, 就是offset 可以整除10000的时候 就休息10秒 [也就是每次同步1w个数据,就休息10秒] , 但还是不行,还是会在5w左右的数据量 出现卡住的情况

    而且每次都在 5w左右 卡住

    所以我现在怀疑是远程数据库 做了什么限制

    但是我不知道怎么办了
    benjiam
        6
    benjiam  
       2015-07-05 12:59:16 +08:00 via Android
    为什么不在5万以后断开继续
    qq2549112
        7
    qq2549112  
    OP
       2015-07-05 13:15:52 +08:00
    @benjiam 谢谢提醒,那我试试这个方法 嘿嘿
    imn1
        8
    imn1  
       2015-07-05 13:17:07 +08:00   1
    如果总是在固定数量出现问题,多数是
    1.远端某个环节有数量限制
    2.内存
    3.到特定某条数据有问题

    如果是数据库的问题,只能自己解决
    在代码的不同运行阶段,适当加一些delete语句,把不再使用的大数据变量扔给GC自动回收
    远程要用 IP
    那个for可以改成表达式
    最好拖数据和数据处理分开,拖到本地再处理,不要处理完再拖
    多进程拖
    qq2549112
        9
    qq2549112  
    OP
       2015-07-05 13:28:17 +08:00
    @imn1 谢谢,我的for 改成什么表达式呀, 我是新手哦,我觉得for 好像是比较正常的

    这个托数据以后,处理也很简单的, 也就是插入到本地另一个数据库 ,不耽误时间的
    imn1
        10
    imn1  
       2015-07-05 13:34:29 +08:00   1
    @qq2549112
    生成器表达式、列表表达式、字典表达式~
    去看看书吧,表达式比循环使用更少资源,更快,大量数据区别很明显
    qq2549112
        11
    qq2549112  
    OP
       2015-07-05 13:46:55 +08:00
    @imn1 谢谢
    lucky2touch
        12
    lucky2touch  
       2015-07-05 15:35:10 +08:00   1
    你这需求是做增量备份?不知道原表是如何设计的,排序的消耗是很大的,除了索引之外,类似的处理方法从设计上来说还有表分区啥的。
    Gandum
        13
    Gandum  
       2015-07-05 15:59:35 +08:00 via iPhone   1
    这个代码应该没啥问题,不如每5W的时候就close,然后再重建连接试试?
    Gandum
        14
    Gandum  
       2015-07-05 16:04:13 +08:00 via iPhone   1
    反正肯定不是内存问题,python在你不引用的时候会自动进行垃圾收集
    qq2549112
        15
    qq2549112  
    OP
       2015-07-05 16:08:21 +08:00
    @lucky2touch 谢谢,需求是 实时的增量备份到另外一个数据库 [mysql to postgresql]

    我重新发了个帖子, http://www.v2ex.com/t/203463

    感谢前辈
    wy315700
        16
    wy315700  
       2015-07-05 16:08:32 +08:00   1
    你给时间戳加一个索引看看
    qq2549112
        17
    qq2549112  
    OP
       2015-07-05 16:08:52 +08:00
    @Gandum 谢谢 现在我找到问题在了,是数据库的问题 我重新发了个帖子, http://www.v2ex.com/t/203463
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3397 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 00:51 PVG 08:51 LAX 16:51 JFK 19:51
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86