推荐学习书目
› Learn Python the Hard Way
Python Sites
› PyPI - Python Package Index
› http://diveintopython.org/toc/index.html
› Pocoo
值得关注的项目
› PyPy
› Celery
› Jinja2
› Read the Docs
› gevent
› pyenv
› virtualenv
› Stackless Python
› Beautiful Soup
› 结巴中文分词
› Green Unicorn
› Sentry
› Shovel
› Pyflakes
› pytest
Python 编程
› pep8 Checker
Styles
› PEP 8
› Google Python Style Guide
› Code Style from The Hitchhiker's Guide
jfry
V2EX  ›  Python

[请教]数据迁移程序的并发应当考虑哪些方面以及如何实现?

  •  
  •   jfry ·
    toaco · Jan 2, 2018 · 3128 views
    This topic created in 3235 days ago, the information mentioned may be changed or developed.

    之前写了一个数据迁移程序 ,但是迁移的速度并不理想.因此想请教各位如果我要实现并发大概应该怎么做.

    目前只能想到协程,多线程,多进程以及 celery .自己也不太清楚各个方案的优劣.

    2 replies  •  2018-01-03 23:23:16 +08:00
    praynise
    praynise
    Jan 3, 2018❤️1
    1
    想问一下最基本的数据迁移是怎么实现的?靠游标吗?还是 pandas 的 to_sql ?我没有看源码…不过,提几点自己经常涉及的,看看是否能给楼主一点点提示:
    1、我自己试过使用多线程加游标的方式,或者 pandas 的 to_sql,个人感觉,pandas 的 to_sql 最慢,多线程加游标略好一点,不过都比不上数据库自带导出+装载功能。多线程感觉并不稳定,被自己 pass 掉了。而协程应该是需要配合非阻塞库使用吧?自己没有试过…
    1.1、之前还考虑过一种思路,就是通过并发,目标数据库建立多个临时表,使用多进程加 insert many 方法,最后再把这几个表 union all 起来合成目标表(针对 insert 会对表加锁的情况)
    2、Extract 数据落地方向:基本各数据库都有自己的文本导出功能,楼主可以封装一下这些命令,做一个源数据库的判断,实现最快的卸载效率,我自己的环境中,db2 使用 db2 export,oracle 使用 sqluldr2,视表的情况还可以根据分区键生成多个文件并发卸载,速度挺快的。而 Transform 在 export 的时候可以使用 sql 提前实现
    3、Load 数据装载方向:装载文本可以增加并发,例如把分本分割成几分,实现并发装载
    以上是自己平时工作中的一点尝试和实现,希望能够对楼主有一点点帮助吧
    mh494078416
    mh494078416
    Jan 3, 2018 via Android❤️1
    2
    全量迁移总结来说有这么几个关键词:批量、多线程、生产者消费者模型、缓存队列、批量写入、压缩传输、数据库 load data 的数据导入方式、statement 缓存等。对数据迁移感兴趣的同学,可以看我的发帖,我们团队有专门这块的岗位
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   914 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 20:29 · PVG 04:29 · LAX 12:29 · JFK 15:29
    ♥ Do have faith in what you're doing.