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

2016-03-17 11:45:22 +08:00
 Sparty

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

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

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

4684 次点击
所在节点    Python
21 条回复
knightdf
2016-03-17 12:01:43 +08:00
"现在想到的一个方法是写一个 python class 储存所有 xml 里面的内容,然后利用旧文件和新文件创造两个 instance ,并比较得出区别。想问问大家这个是否是最佳选择?"
这和 MySQL 拿下来对比有什么区别。。。我觉得一周一次你真不用在乎时间问题。
可以分块算 hash 做局部更新
3dwelcome
2016-03-17 12:15:31 +08:00
这就是 mysql 的差异化更新策略嘛,两个不同的 mysql 数据库,一个本地一个服务器的,本地的每周清空导入 100 万行数据,然后服务器数据库用差异化对比更新成和本地库一样的。
Sparty
2016-03-17 12:49:21 +08:00
@knightdf 因为用 python 来比较避免了对服务器的访问,虽然对于少量内容来说消耗时间差不多,但是从服务器上取下所有内容还是很耗时的,这一点我在做 insert 的时候感觉很明显。 你说的分块 hash 具体是怎么样,可以展开说一下嘛?
Sparty
2016-03-17 12:54:29 +08:00
@3dwelcome 谢谢指教,能详细说一下 "差异化更新" 具体指的是什么吗?是在 python 里面实现吗?
icedx
2016-03-17 12:56:41 +08:00
100 万行的 xml
直接解析 XML 对比 XML 啊
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
2016-03-17 13:07:53 +08:00
@icedx 这个工作量比读取两个文件生成 python instance 的工作量要大得多吧?毕竟文件是完全格式化的,大概一百行的代码就可以读取到每一条信息,速度也很快。我对文件检查异同没有什么经验,如果有什么好的方法麻烦介绍一下,谢谢。
Sparty
2016-03-17 13:38:01 +08:00
@3dwelcome
感觉这个方法在技术上最可行而且最能达到需求。
现在情况是这样:服务器上的数据库是被用来给移动端更新本地数据库使用的。他们的要求是移动端建立本地数据库并且每周在服务器数据库更新之后来更新本地数据库。(应用程序的使用场景是离线)这样的话双数据库热更新是否能进一步做到移动端数据库与服务器数据库的同步?
jmc891205
2016-03-17 13:44:29 +08:00
储存所有 xml 里的内容是什么意思?存字符串吗?
这样可能会用很多 memory 如果 xml 继续增加到 memory 装不下就麻烦了
pelloz
2016-03-17 16:11:41 +08:00
每周更新?上周的 XML 你还留着在吧,如果 xml 的数据格式比较好比较的话,你完全可以直接比较本周与上周的 xml 内容,然后将有变动的地方单独去数据库更新。
bk201
2016-03-17 16:13:21 +08:00
全导入另外一个库然后 sql 做差集插入数据。
m8syYID5eaas8hF7
2016-03-17 16:16:17 +08:00
其实这样的话不如部署一个 gitlab ,直接开个新项目来存 xml 。。。
defunct9
2016-03-17 16:49:40 +08:00
perl ,以前在京东导入海量数据的时候最快的方法是 perl+oracle 。
mhycy
2016-03-17 17:24:17 +08:00
看了半天没明白这个 XML 的意义。。。
hitmanx
2016-03-17 17:40:55 +08:00
直接解析\比较这周和上周的xml后增量更新?可以用 c+tinyxml 去做,肯定比python要快
sunchen
2016-03-17 17:56:53 +08:00
建新表导入新数据或,导入的过程做 merge ,然后 drop 掉原表
wayslog
2016-03-17 18:14:46 +08:00
同不理解你这个 xml 的意义……
数据库是编排好的存储格式吧?
用两个表,写存储过程合并,一般情况下比你在 Python 里比较要快多了……
fy
2016-03-17 18:30:28 +08:00
每周一次的任务,楼主担心个啥效率问题,这还要优化吗?
zanpen2000
2016-03-17 21:37:40 +08:00
行哈希搞定
stardust21
2016-03-17 21:44:24 +08:00
@fy LZ 说移动端的数据库也要同步

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/264149

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX