欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

PHP 100W+的数据写入一个XML文件,如何做能提高效率?

程序员文章站 2024-01-30 17:43:58
...
问题场景:
公司有100W+的数据要提交给第三方平台,第三方平台要求使用XML的文件格式(上传时可以压缩成gz格式),但也要求把所有的数据写入一个XML文件,不可以分割;
我的做法是将数据写入到$dom对象里,最后统一 $dom->save($xmlFile); 这种方式占用内存太大,而且100W+的产品写入操作完成需要很长的时间。

我想请问一下各位大拿,有没有更好的建议,可以减少内存占用,以及缩短Job执行时间的方法呢?
非常感谢~~~

回复内容:

问题场景:
公司有100W+的数据要提交给第三方平台,第三方平台要求使用XML的文件格式(上传时可以压缩成gz格式),但也要求把所有的数据写入一个XML文件,不可以分割;
我的做法是将数据写入到$dom对象里,最后统一 $dom->save($xmlFile); 这种方式占用内存太大,而且100W+的产品写入操作完成需要很长的时间。

我想请问一下各位大拿,有没有更好的建议,可以减少内存占用,以及缩短Job执行时间的方法呢?
非常感谢~~~

试试这个思路可以么? http://phpedia.net/1v2knpye
PHP 100W+的数据写入一个XML文件,如何做能提高效率?

  1. 内存虚拟成一块硬盘,然后写入你的内存硬盘
  2. 拿到一个数据就写入file,而不是拿到所有数据才写人

  • 如果xml结构不复杂的话,用字符串拼接 往往比使用xml库来导出xml数据要快很多。
  • 换别的语言试试,php对文件I/O的操作是很慢的。

用dom就必须把所有的数据全部放到内存里面

我觉得直接用字符串拼xml会很快,而且拼好一块就append到文件里面,应该会快很多

为何不考虑json格式呢?解析存储传输都比xml格式的有优势。
而且php支持json和xml格式的互相转换。
但100w+的数据没有测试过转换的耗费多少。

这个需求中,写入一个XML文件并不是必须的。

值得考虑用流水线式的模型解决问题。上传数据不需要非得等XML全生成完了才开始,而是只需生成一点XML就上传一点。

gzip也是一个纯粹流式的压缩(进来一点就出去一点),所以gzip也可以简单插入到这个操作流之中。


无论如何提交,100W都很考验网络连接的质量和对方API平台的处理能力,请首先尽可能找到分批提交的办法。

不是有xmlreader 和 xmlwriter 吗?可以不断读取Xml文档中的声明,节点,且不会一次加载.

    file_put_contents($fileName, $contents, FILE_APPEND);

追加没有任何问题,webserver log日志比这个大多了

楼主这是要做feed文件吧,我也做过,数量级比你大得多,我是用php直接拼接xml的,不用类。
简单说是将大任务割成小任务,分次处理,不存在内存不够之类的问题。
方法如下:
$total 一共有多少记录
$batch 一次处理多少记录
ceil($total/$batch)得到处理次数
将这些数据用ajax请求方式,一次又一次地调用,每次都往后处理一批数据,数据写入就用:
file_put_contents($fileName, $contents, FILE_APPEND); 这个方法,前面 @tohilary 已经说了,我这正好也是用的这种方式,一次生成G级文件没问题,我还写了个进度条,效果像这样

PHP 100W+的数据写入一个XML文件,如何做能提高效率?

1.每次都使用LIMIT 0,100来取数据(每次都取前100条),这样不会因为页数大而导致从数据库拉取数据分页慢【这样操作很快】
2.使用100个多线程+innodb事务进行对操作过的数据进行标记,如:isWrite=1(代表已经写入文件了)
如上所述,每次可以执行100*100=1W条数据,执行100批,file_put_contents($fileName, $contents, FILE_APPEND);生成100个节点文件【这样操作需要等一会...】
3.最后一步,把上述100个XML节点文件合并成为1个大XML文件即可,可以用shell命令:copy /b *.xml all.xml【这样操作很快】
具体事务请参考 Mysql Innodb 事务在业务中的具体使用案例 + Demo演示

我担心的是你内存占用太多,会很慢啊

相关标签: php xml