84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
问题场景:公司有100W+的数据要提交给第三方平台,第三方平台要求使用XML的文件格式(上传时可以压缩成gz格式),但也要求把所有的数据写入一个XML文件,不可以分割;我的做法是将数据写入到$dom对象里,最后统一 $dom->save($xmlFile); 这种方式占用内存太大,而且100W+的产品写入操作完成需要很长的时间。
我想请问一下各位大拿,有没有更好的建议,可以减少内存占用,以及缩短Job执行时间的方法呢?非常感谢~~~
学习是最好的投资!
不是有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级文件没问题,我还写了个进度条,效果像这样
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演示
我担心的是你内存占用太多,会很慢啊
试试这个思路可以么? http://phpedia.net/1v2knpye
用dom就必须把所有的数据全部放到内存里面
我觉得直接用字符串拼xml会很快,而且拼好一块就append到文件里面,应该会快很多
为何不考虑json格式呢?解析存储传输都比xml格式的有优势。而且php支持json和xml格式的互相转换。但100w+的数据没有测试过转换的耗费多少。
不是有xmlreader 和 xmlwriter 吗?可以不断读取Xml文档中的声明,节点,且不会一次加载.
追加没有任何问题,webserver log日志比这个大多了
楼主这是要做feed文件吧,我也做过,数量级比你大得多,我是用php直接拼接xml的,不用类。
简单说是将大任务割成小任务,分次处理,不存在内存不够之类的问题。
方法如下:
$total 一共有多少记录
$batch 一次处理多少记录
ceil($total/$batch)得到处理次数
将这些数据用ajax请求方式,一次又一次地调用,每次都往后处理一批数据,数据写入就用:
file_put_contents($fileName, $contents, FILE_APPEND); 这个方法,前面 @tohilary 已经说了,我这正好也是用的这种方式,一次生成G级文件没问题,我还写了个进度条,效果像这样
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演示
我担心的是你内存占用太多,会很慢啊
试试这个思路可以么? http://phpedia.net/1v2knpye
用dom就必须把所有的数据全部放到内存里面
我觉得直接用字符串拼xml会很快,而且拼好一块就append到文件里面,应该会快很多
为何不考虑json格式呢?解析存储传输都比xml格式的有优势。
而且php支持json和xml格式的互相转换。
但100w+的数据没有测试过转换的耗费多少。