当前位置: 首页 > news >正文

建网站需要多钱客户关系crm管理系统

建网站需要多钱,客户关系crm管理系统,合肥网页设计工资,浙江高端建设网站stax 和jaxb 关系介绍 上周末#xff0c;我开始考虑如何以一种资源友好的方式处理大量XML数据。我要解决的主要问题是如何以块的形式处理大型XML文件#xff0c;同时提供上游/下游系统#xff0c;需要处理一些数据。 当然#xff0c;我已经使用JAXB技术已有几年了。 使用J… stax 和jaxb 关系 介绍 上周末我开始考虑如何以一种资源友好的方式处理大量XML数据。我要解决的主要问题是如何以块的形式处理大型XML文件同时提供上游/下游系统需要处理一些数据。 当然我已经使用JAXB技术已有几年了。 使用JAXB的主要优点是可以加快产品上市时间 如果拥有XML模式则可以使用工具自动自动生成相应的Java域模型类Eclipse Indigo各种工具中的Maven jaxb插件ant任务仅举几例。 然后JAXB API提供一个Marshaller和Unmarshaller来编写/读取XML数据从而映射Java域模型。 当JAXB的思想作为我的问题解决方案我suddendlly意识到JAXB保存在内存中的XML架构的整体客观 所以一个显而易见的问题是“如何将我们的基础设施应对大型XML文件例如在我的情况与一些元素 100,000是否要使用JAXB”。 我可以简单地生成一个大的XML文件然后为其创建一个客户端并了解有关内存消耗的信息。 众所周知在Java中主要有两种处理XML数据的方法DOM和SAX。 使用DOMXML文档以树的形式表示在内存中。 如果需要对树节点进行樱桃式访问或需要编写简短的XML文档则DOM很有用。 另一方面是一种事件驱动技术SAX该技术当时将整个文档解析为一个XML元素并且对于每个XML重要事件将回调“推”到Java客户端然后该Java客户端处理它们例如START_DOCUMENTSTART_ELEMENTEND_ELEMENT等。 由于SAX不会将整个文档带入内存而是将类似游标的方法应用于XML处理因此它不会消耗大量内存。 SAX的缺点是它处理整个文档的开始到结束 这可能不一定是大型XML文档所需要的。 例如在我的场景中我希望能够传递给下游系统XML元素但可用但同时也许我只想一次传递100个元素实现某种分页解。 从内存消耗的角度来看DOM似乎过于苛刻而SAX似乎可以满足我的需求。 我记得曾经读过一些有关STax的知识它是一种Java技术在RAM友好的同时提供了拉XML元素 而不是推送XML元素例如SAX的能力。 然后我研究了该技术并决定STax可能是我想要的折衷方案。 但是我想保留JAXB提供的简单编程模型所以我确实需要将两者结合起来。 在调查STax时我遇到了Woodstox。 这个开源项目有望成为一个比许多其他工具更快的XML解析器因此我决定也将其包含在我的基准测试中。 现在我具有创建基准的所有元素以便在处理大型XML文档时为我提供内存消耗和处理速度指标。 基准计划 为了创建基准我需要执行以下操作 创建一个定义我的域模型的XML模式。 这将是JAXB创建Java域模型的输入 创建代表该模型的三个大型XML文件分别具有10,000 / 100,000 / 1,000,000元素 有一个纯JAXB客户端它将完全在内存中解组大型XML文件 有一个STax / JAXB客户端它将SAX技术的低内存消耗与JAXB提供的简便编程模型结合在一起 拥有一个具有与STax / JAXB客户端相同特征的Woodstox / JAXB客户端简而言之我只是想更改基础解析器看看是否可以获得任何性能提升 记录内存消耗和处理速度例如每个解决方案以多快的速度使XML块作为JAXB域模型类在内存中可用 因为我们知道一张图片可以说一千个单词所以可以图形方式显示结果。 域模型XML模式 ?xml version1.0 encodingUTF-8? schema xmlnshttp://www.w3.org/2001/XMLSchema targetNamespacehttp://uk.co.jemos.integration.xml/large-file xmlns:tnshttp://uk.co.jemos.integration.xml/large-file elementFormDefaultqualifiedcomplexType namePersonTypesequenceelement namefirstName typestring/elementelement namelastName typestring/elementelement nameaddress1 typestring/elementelement nameaddress2 typestring/elementelement namepostCode typestring/elementelement namecity typestring/elementelement namecountry typestring/element/sequenceattribute nameactive typeboolean userequired //complexTypecomplexType namePersonsTypesequenceelement nameperson typetns:PersonType maxOccursunbounded minOccurs1/element/sequence/complexTypeelement namepersons typetns:PersonsType/element /schema 我决定建立一个相对简单的域模型用XML元素代表人物及其姓名和地址。 我还想记录一个人是否活跃。 使用JAXB创建Java模型 我是Maven的粉丝并将其用作构建系统的默认工具。 这是我为此小基准定义的POM project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIduk.co.jemos.tests.xml/groupIdartifactIdlarge-xml-parser/artifactIdversion1.0.0-SNAPSHOT/versionpackagingjar/packagingnamelarge-xml-parser/nameurlhttp://www.jemos.co.uk/urlproperties project.build.sourceEncodingUTF-8/project.build.sourceEncoding/propertiesbuildpluginsplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdversion2.3.2/versionconfigurationsource1.6/sourcetarget1.6/target/configuration/pluginplugingroupIdorg.jvnet.jaxb2.maven2/groupIdartifactIdmaven-jaxb2-plugin/artifactIdversion0.7.5/versionexecutionsexecutiongoalsgoalgenerate/goal/goals/execution/executionsconfigurationschemaDirectory${basedir}/src/main/resources/schemaDirectoryincludeSchemasincludeSchema**/*.xsd/includeSchema/includeSchemasextensiontrue/extensionargsarg-enableIntrospection/argarg-XtoString/argarg-Xequals/argarg-XhashCode/arg/argsremoveOldOutputtrue/removeOldOutputverbosetrue/verbosepluginsplugingroupIdorg.jvnet.jaxb2_commons/groupIdartifactIdjaxb2-basics/artifactIdversion0.6.1/version/plugin/plugins/configuration/pluginplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-jar-plugin/artifactIdversion2.3.1/versionconfigurationarchivemanifestaddClasspathtrue/addClasspathmainClassuk.co.jemos.tests.xml.XmlPullBenchmarker/mainClass/manifest/archive/configuration/pluginplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-assembly-plugin/artifactIdversion2.2/versionconfigurationoutputDirectory${project.build.directory}/site/downloads/outputDirectorydescriptorsdescriptorsrc/main/assembly/project.xml/descriptordescriptorsrc/main/assembly/bin.xml/descriptor/descriptors/configuration/plugin/plugins/builddependenciesdependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.5/versionscopetest/scope/dependencydependencygroupIduk.co.jemos.podam/groupIdartifactIdpodam/artifactIdversion2.3.11.RELEASE/version/dependencydependencygroupIdcommons-io/groupIdartifactIdcommons-io/artifactIdversion2.0.1/version/dependency!-- XML binding stuff --dependencygroupIdcom.sun.xml.bind/groupIdartifactIdjaxb-impl/artifactIdversion2.1.3/version/dependencydependencygroupIdorg.jvnet.jaxb2_commons/groupIdartifactIdjaxb2-basics-runtime/artifactIdversion0.6.0/version/dependencydependencygroupIdorg.codehaus.woodstox/groupIdartifactIdstax2-api/artifactIdversion3.0.3/version/dependency/dependencies /project 关于此pom.xml的几点注意事项。 我使用Java 6因为从版本6开始Java包含了JAXBDOMSAX和STax的所有XML库。 为了从XSD架构自动生成域模型类我使用了出色的maven-jaxb2-plugin该插件除其他外还允许获得具有toStringequals和hashcode支持的POJO。 我还声明了jar插件以为基准创建可执行的jar并声明程序集插件以分发基准的可执行版本。 基准测试的代码附于此后因此如果您要自己构建并运行它只需解压缩项目文件打开命令行并运行 $ mvn全新安装程序 此命令会将* -bin。*文件放入目标/站点/下载文件夹中。 解压缩您的首选项之一并运行基准测试-Dcreate.xml true将生成XML文件。如果已经拥有这些文件例如第一次运行之后则不要传递它 $ java -jar -Dcreate.xml true large-xml-parser-1.0.0-SNAPSHOT.jar 创建测试数据 为了创建测试数据我使用了PODAM 一种Java工具用数据自动填充POJO和JavaBean。 代码很简单 JAXBContext context JAXBContext.newInstance(xml.integration.jemos.co.uk.large_file);Marshaller marshaller context.createMarshaller();marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);marshaller.setProperty(Marshaller.JAXB_ENCODING, UTF-8);PersonsType personsType new ObjectFactory().createPersonsType();ListPersonType persons personsType.getPerson();PodamFactory factory new PodamFactoryImpl();for (int i 0; i nbrElements; i) {persons.add(factory.manufacturePojo(PersonType.class));}JAXBElementPersonsType toWrite new ObjectFactory().createPersons(personsType);File file new File(fileName);BufferedOutputStream bos new BufferedOutputStream(new FileOutputStream(file), 4096);try {marshaller.marshal(toWrite, bos);bos.flush();} finally {IOUtils.closeQuietly(bos);} XmlPullBenchmarker在〜/ xml-benchmark下生成三个大​​型XML文件 large-person-10000.xml大约3M large-person-100000.xml大约30M large-person-1000000.xml大约300M 每个文件如下所示 ?xml version1.0 encodingUTF-8 standaloneyes? persons xmlnshttp://uk.co.jemos.integration.xml/large-fileperson activefalsefirstNameUlt6yn0D7L/firstNamelastNameU8DJoUTlK2/lastNameaddress1DxwlpOw6X3/address1address2O4GGvxIMo7/address2postCodeIo7Kuz0xmz/postCodecitylMIY1uqKXs/citycountryZhTukbtwti/country/personperson activefalsefirstNamegBc7KeX9Tn/firstNamelastNamekxmWNLPREp/lastNameaddress19BIBS1m5GR/address1address2hmtqpXjcpW/address2postCodebHpF1rRldM/postCodecityYDJJillYrw/citycountryxgsTDJcfjc/country/person[..etc] /persons 每个文件包含10,000 / 100,000 / 1,000,000 person元素。 运行环境 我在三种不同的环境下尝试了基准测试程序 Ubuntu 1064位作为 Windows 7 Ultimate上的虚拟机运行 具有CPU i5、750 2.67GHz和2.66GHz8GB RAM其中4GB专用于VM。 JVM1.6.0_25热点 Windows 7 Ultimate 用于托管上述VM因此具有相同的处理器。 JVM1.6.0_24热点 Ubuntu 10、32 位 3GB RAM双核。 JVM1.6.0_24OpenJDK XML解组 为了解组代码我使用了三种不同的策略 纯JAXB STAX JAXB 伍德斯托克斯 JAXB 纯JAXB解组 我过去使用JAXB解组大型XML文件的代码如下 private void readLargeFileWithJaxb(File file, int nbrRecords) throws Exception {JAXBContext ucontext JAXBContext.newInstance(xml.integration.jemos.co.uk.large_file);Unmarshaller unmarshaller ucontext.createUnmarshaller();BufferedInputStream bis new BufferedInputStream(new FileInputStream(file));long start System.currentTimeMillis();long memstart Runtime.getRuntime().freeMemory();long memend 0L;try {JAXBElementPersonsType root (JAXBElementPersonsType) unmarshaller.unmarshal(bis);root.getValue().getPerson().size();memend Runtime.getRuntime().freeMemory();long end System.currentTimeMillis();LOG.info(JAXB ( nbrRecords ): - Total Memory used: (memstart - memend));LOG.info(JAXB ( nbrRecords ): Time taken in ms: (end - start));} finally {IOUtils.closeQuietly(bis);} } 该代码使用单线解组每个XML文件 JAXBElementPersonsType root (JAXBElementPersonsType) unmarshaller.unmarshal(bis); 我还访问了基础PersonType集合的大小以“接触”内存数据。 顺便说一句调试该应用程序显示在这行代码之后内存中确实确实有所有10,000个元素可用。 JAXB STax 使用STax我只需要使用XMLStreamReader遍历所有person元素然后依次将每个元素传递给JAXB以将其解组为PersonType域模型对象。 代码如下 // set up a StAX reader XMLInputFactory xmlif XMLInputFactory.newInstance(); XMLStreamReader xmlr xmlif.createXMLStreamReader(new FileReader(file)); JAXBContext ucontext JAXBContext.newInstance(PersonType.class); Unmarshaller unmarshaller ucontext.createUnmarshaller(); long start System.currentTimeMillis(); long memstart Runtime.getRuntime().freeMemory(); long memend 0L;try {xmlr.nextTag();xmlr.require(XMLStreamConstants.START_ELEMENT, null, persons);xmlr.nextTag();while (xmlr.getEventType() XMLStreamConstants.START_ELEMENT) {JAXBElementPersonType pt unmarshaller.unmarshal(xmlr,PersonType.class);if (xmlr.getEventType() XMLStreamConstants.CHARACTERS) {xmlr.next();}}memend Runtime.getRuntime().freeMemory();long end System.currentTimeMillis();LOG.info(STax - ( nbrRecords ): - Total memory used: (memstart - memend));LOG.info(STax - ( nbrRecords ): Time taken in ms: (end - start));} finally {xmlr.close();} } 请注意这次创建上下文时我必须指定它用于PersonType对象并且在调用JAXB解组时我还必须传递所需的返回类类型并带有 JAXBElementPersonType pt unmarshaller.unmarshal(xmlr, PersonType.class); 请注意我对对象不做任何事情只是创建它以通过不引入任何不必要的步骤来使基准保持真实和可能。 JAXB Woodstox 对于Woodstox此方法与用于STax的方法非常相似。 实际上Woodstox提供了与STax2兼容的API所以我要做的就是提供正确的工厂然后……砰 我让伍德斯托克斯在掩护下工作。 private void readLargeXmlWithFasterStax(File file, int nbrRecords)throws FactoryConfigurationError, XMLStreamException,FileNotFoundException, JAXBException {// set up a Woodstox readerXMLInputFactory xmlif XMLInputFactory2.newInstance();XMLStreamReader xmlr xmlif.createXMLStreamReader(new FileReader(file));JAXBContext ucontext JAXBContext.newInstance(PersonType.class);Unmarshaller unmarshaller ucontext.createUnmarshaller();long start System.currentTimeMillis();long memstart Runtime.getRuntime().freeMemory();long memend 0L;try {xmlr.nextTag();xmlr.require(XMLStreamConstants.START_ELEMENT, null, persons);xmlr.nextTag();while (xmlr.getEventType() XMLStreamConstants.START_ELEMENT) {JAXBElementPersonType pt unmarshaller.unmarshal(xmlr,PersonType.class);if (xmlr.getEventType() XMLStreamConstants.CHARACTERS) {xmlr.next();}}memend Runtime.getRuntime().freeMemory();long end System.currentTimeMillis();LOG.info(Woodstox - ( nbrRecords ): Total memory used: (memstart - memend));LOG.info(Woodstox - ( nbrRecords ): Time taken in ms: (end - start));} finally {xmlr.close();} } 请注意以下行 XMLInputFactory xmlif XMLInputFactory2.newInstance(); 我在哪里传递STax2 XMLInputFactory。 这使用Woodstox实现。 主循环 一旦文件就位通过传递-Dcreate.xml true获得此文件主程序将执行以下操作 System.gc(); System.gc();for (int i 0; i 10; i) {main.readLargeFileWithJaxb(new File(OUTPUT_FOLDER File.separatorChar large-person-10000.xml), 10000);main.readLargeFileWithJaxb(new File(OUTPUT_FOLDER File.separatorChar large-person-100000.xml), 100000);main.readLargeFileWithJaxb(new File(OUTPUT_FOLDER File.separatorChar large-person-1000000.xml), 1000000);main.readLargeXmlWithStax(new File(OUTPUT_FOLDER File.separatorChar large-person-10000.xml), 10000);main.readLargeXmlWithStax(new File(OUTPUT_FOLDER File.separatorChar large-person-100000.xml), 100000);main.readLargeXmlWithStax(new File(OUTPUT_FOLDER File.separatorChar large-person-1000000.xml), 1000000);main.readLargeXmlWithFasterStax(new File(OUTPUT_FOLDER File.separatorChar large-person-10000.xml), 10000);main.readLargeXmlWithFasterStax(new File(OUTPUT_FOLDER File.separatorChar large-person-100000.xml), 100000);main.readLargeXmlWithFasterStax(new File(OUTPUT_FOLDER File.separatorChar large-person-1000000.xml), 1000000); } 它邀请GC运行尽管我们知道这是由GC线程决定的。 然后它将每个策略执行10次以标准化 RAM和CPU消耗。 然后通过十次运行的平均值来收集最终数据。 内存消耗的基准测试结果 下面是一些图表这些图表显示了在解组10,000 / 100,000 / 1,000,000文件时不同运行环境下的内存消耗。 您可能会注意到与STax相关的策略的内存消耗通常显示为负值。 这意味着在解组所有元素之后比在解组循环开始时有更多的空闲内存。 反过来这表明GC使用STax运行的次数比使用JAXB运行的次数多得多。 如果有人考虑这是合乎逻辑的。 由于使用STax时我们不会将所有对象都保留在内存中因此有更多对象可用于垃圾回收。 在这种特殊情况下我认为在while循环中创建的PersonType对象符合GC的条件并进入年轻一代区域然后由GC对其进行回收。 但是这应该对性能产生最小的影响因为我们知道从年轻一代空间中声明对象非常有效。 10,000个XML元素的摘要 100,000个XML元素的摘要 1,000,000个XML元素的摘要 处理速度的基准结果 10,000个元素的结果 100,000个元素的结果 1,000,000个元素的结果 结论 在所有三种不同环境下的结果尽管有所不同但都告诉我们相同的故事 如果您正在寻找性能例如XML解组速度请选择JAXB 如果您正在寻找内存不足的使用并准备牺牲一些性能速度请使用STax。 我个人的看法是我不会选择Woodstox但是我会选择JAXB如果我需要处理能力并且能够负担得起RAM或STax如果我不需要最高速度并且基础设施资源不足 。 这些技术都是Java标准并且是从Java 6开始的JDK的一部分。 资源基准测试器源代码 邮编版本 下载Large-xml-parser-1.0.0-SNAPSHOT-project tar.gz版本 下载Large-xml-parser-1.0.0-SNAPSHOT-project.tar tar.bz2版本 下载Large-xml-parser-1.0.0-SNAPSHOT-project.tar 标杆可执行文件 邮编版本 下载Large-xml-parser-1.0.0-SNAPSHOT-bin tar.gz版本 下载Large-xml-parser-1.0.0-SNAPSHOT-bin.tar tar.bz2版本 下载Large-xml-parser-1.0.0-SNAPSHOT-bin.tar 数据文件 Ubuntu 64位VM运行环境 下载Stax-vs-jaxb-ubuntu-64-vm Ubuntu 32位运行环境 下载Stax-vs-jaxb-ubuntu-32位 Windows 7 Ultimate运行环境 下载Stax-vs-jaxb-windows7 参考 Java中的XML编组基准 Marco Tedone博客博客中的JCG合作伙伴 Marco Tedone的JAXB vs STax vs Woodstox 。 翻译自: https://www.javacodegeeks.com/2012/05/xml-unmarshalling-benchmark-jaxb-vs.htmlstax 和jaxb 关系
http://www.huolong8.cn/news/78625/

相关文章:

  • 汕头企业网站模板建站wordpress模板调用文件夹下
  • 安徽住房和建设网站wordpress 国产评论插件
  • 做火锅加盟哪个网站好网站更换域名备案
  • 外贸网站教程wordpress有点尴尬诶该页无法显示
  • 网站运营方案新乡建设企业网站
  • 网站收录很少却有排名盐城哪里做网站
  • 常州住房和城乡建设局网站首页不需要充值的传奇手游
  • 北京做胃镜哪好德胜门网站I衡阳网络营销公司
  • 薛城做网站龙山建设工程有限公司网站
  • 做虚假彩票网站判几年素锦wordpress
  • 投资手机网站源码dt网站设计
  • 毕业设计论文网站广州活动网站设计
  • 高端网站定制方案高端网站建设定制
  • 上海网站设计推荐刻wordpress 图片多
  • 做soho外贸网站销售管理系统c语言
  • vs2010 iis 网站开发西部数码网站管理助手 301
  • 网站建设教程微云网盘长春建站软件
  • 乐云seo网站建设公司湘潭网页定制
  • 自主建站网站找人做任务网站有哪些
  • 视频网站dedecms做电商网站要多少钱
  • 佛山新网站建设流程台州椒江网站建设
  • 网站顶端图片素材导航网站超链接如何做
  • 怎么给自己的网站推广网站文章更新怎么做
  • 全屏产品网站常州网站建设公司信息
  • 英文网站建设60下载源代码建网站
  • 温州手机网站开发微信小程序投票怎么做
  • 怎样做网站用html新网站注册
  • 大人小孩做网站海外信息流推广怎么做
  • 深圳做网站比较好广安网站seo
  • 软件开发税率是13%还是6搜索引擎优化的主要工作有