V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
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
Sparty
V2EX  ›  Python

100 万行的 xml 文件存入数据库,文件每周更新,求解最佳办法?

  •  
  •   Sparty · 2016-03-17 11:45:22 +08:00 · 4653 次点击
    这是一个创建于 3166 天前的主题,其中的信息可能已经有所发展或是发生改变。

    已经用 python 写好了读取文件并存入数据库的程序,但现在不知道更新功能应该如何实现。如果是从 mysql 把数据拿下来并一一比较的话太耗时。 现在想到的一个方法是写一个 python class 储存所有 xml 里面的内容,然后利用旧文件和新文件创造两个 instance ,并比较得出区别。想问问大家这个是否是最佳选择?

    文件内容是一家公司的产品,内容就是<product>(中间有很多 subtag 包含产品具体描述)</product>。

    不允许抹掉数据库重新载入内容。文件内的产品信息会改变, 产品本身也会有增删的情况。每个产品有独立的型号。

    21 条回复    2016-03-17 21:50:23 +08:00
    knightdf
        1
    knightdf  
       2016-03-17 12:01:43 +08:00
    "现在想到的一个方法是写一个 python class 储存所有 xml 里面的内容,然后利用旧文件和新文件创造两个 instance ,并比较得出区别。想问问大家这个是否是最佳选择?"
    这和 MySQL 拿下来对比有什么区别。。。我觉得一周一次你真不用在乎时间问题。
    可以分块算 hash 做局部更新
    3dwelcome
        2
    3dwelcome  
       2016-03-17 12:15:31 +08:00
    这就是 mysql 的差异化更新策略嘛,两个不同的 mysql 数据库,一个本地一个服务器的,本地的每周清空导入 100 万行数据,然后服务器数据库用差异化对比更新成和本地库一样的。
    Sparty
        3
    Sparty  
    OP
       2016-03-17 12:49:21 +08:00
    @knightdf 因为用 python 来比较避免了对服务器的访问,虽然对于少量内容来说消耗时间差不多,但是从服务器上取下所有内容还是很耗时的,这一点我在做 insert 的时候感觉很明显。 你说的分块 hash 具体是怎么样,可以展开说一下嘛?
    Sparty
        4
    Sparty  
    OP
       2016-03-17 12:54:29 +08:00
    @3dwelcome 谢谢指教,能详细说一下 "差异化更新" 具体指的是什么吗?是在 python 里面实现吗?
    icedx
        5
    icedx  
       2016-03-17 12:56:41 +08:00
    100 万行的 xml
    直接解析 XML 对比 XML 啊
    3dwelcome
        6
    3dwelcome  
       2016-03-17 13:05:31 +08:00
    我可能说的不严谨,"差异化更新"应该是"差异化同步"。就是利用第三方的 mysql 双数据库同步功能,你只要每周把 py 的数据,直接到入一个本地数据库,然后用现成的工具,(比如 Red-Gate's MySQL Schema & Data Compare, Maatkit, liquibase, Toad, Nob Hill Database Compare, MySQL Diff, SQL EDT),同步到网上 MYSQL 服务器数据库就可以了。

    工具会对比服务器和本地库的差异性,只提交和更新一部分被修改过的数据,做双数据库热更新,这样产生的流量就会很少。
    Sparty
        7
    Sparty  
    OP
       2016-03-17 13:07:53 +08:00
    @icedx 这个工作量比读取两个文件生成 python instance 的工作量要大得多吧?毕竟文件是完全格式化的,大概一百行的代码就可以读取到每一条信息,速度也很快。我对文件检查异同没有什么经验,如果有什么好的方法麻烦介绍一下,谢谢。
    Sparty
        8
    Sparty  
    OP
       2016-03-17 13:38:01 +08:00
    @3dwelcome
    感觉这个方法在技术上最可行而且最能达到需求。
    现在情况是这样:服务器上的数据库是被用来给移动端更新本地数据库使用的。他们的要求是移动端建立本地数据库并且每周在服务器数据库更新之后来更新本地数据库。(应用程序的使用场景是离线)这样的话双数据库热更新是否能进一步做到移动端数据库与服务器数据库的同步?
    jmc891205
        9
    jmc891205  
       2016-03-17 13:44:29 +08:00
    储存所有 xml 里的内容是什么意思?存字符串吗?
    这样可能会用很多 memory 如果 xml 继续增加到 memory 装不下就麻烦了
    pelloz
        10
    pelloz  
       2016-03-17 16:11:41 +08:00
    每周更新?上周的 XML 你还留着在吧,如果 xml 的数据格式比较好比较的话,你完全可以直接比较本周与上周的 xml 内容,然后将有变动的地方单独去数据库更新。
    bk201
        11
    bk201  
       2016-03-17 16:13:21 +08:00
    全导入另外一个库然后 sql 做差集插入数据。
    m8syYID5eaas8hF7
        12
    m8syYID5eaas8hF7  
       2016-03-17 16:16:17 +08:00
    其实这样的话不如部署一个 gitlab ,直接开个新项目来存 xml 。。。
    defunct9
        13
    defunct9  
       2016-03-17 16:49:40 +08:00
    perl ,以前在京东导入海量数据的时候最快的方法是 perl+oracle 。
    mhycy
        14
    mhycy  
       2016-03-17 17:24:17 +08:00
    看了半天没明白这个 XML 的意义。。。
    hitmanx
        15
    hitmanx  
       2016-03-17 17:40:55 +08:00
    直接解析\比较这周和上周的xml后增量更新?可以用 c+tinyxml 去做,肯定比python要快
    sunchen
        16
    sunchen  
       2016-03-17 17:56:53 +08:00
    建新表导入新数据或,导入的过程做 merge ,然后 drop 掉原表
    wayslog
        17
    wayslog  
       2016-03-17 18:14:46 +08:00
    同不理解你这个 xml 的意义……
    数据库是编排好的存储格式吧?
    用两个表,写存储过程合并,一般情况下比你在 Python 里比较要快多了……
    fy
        18
    fy  
       2016-03-17 18:30:28 +08:00
    每周一次的任务,楼主担心个啥效率问题,这还要优化吗?
    zanpen2000
        19
    zanpen2000  
       2016-03-17 21:37:40 +08:00 via iPhone
    行哈希搞定
    stardust21
        20
    stardust21  
       2016-03-17 21:44:24 +08:00
    @fy LZ 说移动端的数据库也要同步
    yangqi
        21
    yangqi  
       2016-03-17 21:50:23 +08:00
    数据库设计没问题的话难道不是直接 insert into ... on duplicate key update 么?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2894 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 13:40 · PVG 21:40 · LAX 05:40 · JFK 08:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.