V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
qq2549112
V2EX  ›  问与答

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

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

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

    然后我 执行 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   ·   实用小工具   ·   1053 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 19:28 · PVG 03:28 · LAX 11:28 · JFK 14:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.