解析xml并且导入mysql

时间:2023-03-09 06:18:11
解析xml并且导入mysql

https://www.zhihu.com/question/28139319

解析超过500G的xml 写入mysql,如何尽快写入?

解析超过500G的xml 写入mysql,如何尽快写入?

现在有一个超过500G的xml,xml中的节点也比较复杂,因为记录可能超过20亿条,所以进行了分表分区(100个表,每个表100个分区),分表用的哈希取模,所以只能用程序写入,
1. 用最笨的方法逐行解析写入,好几天不见完。
2. 合并insert value,没100条进行事务写入,还是很慢。

有什么好的建议能尽快将数据导入数据库?

1 条评论
分享
默认排序按时间排序

4 个回答

0赞同反对,不会显示你的姓名
分批把 XML 解析成特定分隔符分割的数据,再使用 LOAD DATA INFILE 导入,速度应该会比题主的方法快。
1赞同反对,不会显示你的姓名
方法(一)
1个xml解析线程,N个insert线程(建议N=32),生产者-消费者模型
每条insert语句插入多条记录

方法(二)
解析xml文件,根据取模写到100个文件中
100个load data infile

1赞同反对,不会显示你的姓名
你这个任务一个是disk时间,一个是cpu时间,一个是db时间,所以首先就是并行处理这些任务。
读取xml就用一个thread好了,反对上面说多线程读的方案,你的硬盘只有一个读入点,并行读有什么好处?
然後把xml丢到一个pool里去解析xml,每解析一个就丢到存储db的pool里。
根據我的知识,你分多个表是沒有意义的,连续写入一定比random写入快很多阿。
还有,先去掉所有的index,全写完再加回来。
0赞同反对,不会显示你的姓名
解析xml并且导入mysql知乎用户 build mind, build world!
用sax 来搞吧,解析很快。
有两种方案
  1. 可以用解析生成insert batch 语句,再来执行这些语句。
  2. 解析组装成对象集合,再按阈值进行批量插入。(堆要开大)

以偶的实践来看

  1. 解析倒不是问题。(2G xml 的解析2-3min) i5 8G
  2. 性能点是数据库,一定要把索引建好。

如果你的xml 不是特别复杂。可以参照如下脚本分割成100m一个的文件来操作:
shell script:

split -C 100m [filename]

分成多个小型XML, 分开单线程读。照最上方的方案。