热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

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

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

回复内容:

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

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

试试这个思路可以么? http://phpedia.net/1v2knpye

  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级文件没问题,我还写了个进度条,效果像这样

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演示

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

推荐阅读
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
author-avatar
想零的时候
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有