[介绍]
Groovy File.append很慢,因为每次都要打开/关闭文件。如果你的处理程序要多次append信息到文件中,那将非常非常的慢!
本文将介绍我最近在使用File.append中碰到的性能问题,以及解决的方式。
Groovy是什么?
https://en.wikipedia.org/wiki/Groovy_%28programming_language%29
http://www.groovy-lang.org/
[问题]
最近(201504)写一个文件处理程序,使用了Groovy的File.append,结果很坑人呀。一个500多兆的文件,弄了几个小时。
[原因]
使用JVisualVM一看,大部分时间在FileOutputStream.close. 找到源代码一看(源码已附上),果然啊,每次都要打开、关闭文件,那必须慢啊。
[解决方案]
直接使用java的FileWriter.append(), 而避免使用Groovy的 ResourceGroovyMethods.append()
使用更大的buffersize, BufferedOutputSteam可以提高效率. 注意: BufferedWriter不会帮助你太多,参考 [实践]Log4j 1.X BufferedIO不工作(<8k时)原因分析, 暨深入探查Java IO Output BufferSizehttp://winnerbao.iteye.com/blog/2219736
[特别提示]
当发现程序效率很低时,不要直接想当然的&急冲冲的将自己怀疑的地方改掉。再想想,并用profiling工具(推荐jvisualvm)看看, 来验证你的猜测。
此处想起某本书(Bob? Joe? 忘了)上写,“你要知道并方便的profiling你的程序”。几年前就读过,但是有什么用
我当时就犯了一个错误,想当然的以为每次写入的东西太少而引起的缓慢。然后就将文件内容缓存到StringBuilder里面,增加每次写入数量,结果“果然快了!”。当时还以为自己有点牛X。实际上是因为缓存了内容,而减少了append(即close)的次数。
[附录]
我的处理程序片段
sourceCSVDealsFile.eachLine { csvDealLine, lineNumber -> if(lineNumber == 1){ //header destCSVDealsFile.append(csvDealLine+"\n") excludedCSVDealsFile.append(csvDealLine+"\n") return } if(shouldBeExcluded(csvDealLine)){ excludedCSVDealsFile.append(csvDealLine+"\n") }else{ destCSVDealsFile.append(csvDealLine+"\n") } }
Groovy File.append (ResourceGroovyMethods.append) 源码
http://grepcode.com/file/repo1.maven.org/maven2/com.ovea.tajin/tajin-all/1.0.b1/org/codehaus/groovy/runtime/ResourceGroovyMethods.java#ResourceGroovyMethods.append%28java.io.File%2Cjava.lang.Object%2Cjava.lang.String%29
/** * Write the text to the File, using the specified encoding. * * @param file a File * @param text the text to write to the File * @param charset the charset used * @throws IOException if an IOException occurs. * @since 1.0 */ public static void write(File file, String text, String charset) throws IOException { BufferedWriter writer = null; try { writer = newWriter(file, charset); writer.write(text); writer.flush(); Writer temp = writer; writer = null; temp.close(); } finally { closeWithWarning(writer); } }
相关推荐
Groovy jar包 3.0.
apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本,希望大家多多下载,apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本,希望大家多多下载,apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本,希望...
赠送jar包:groovy-3.0.9.jar; 赠送原API文档:groovy-3.0.9-javadoc.jar; 赠送源代码:groovy-3.0.9-sources.jar; 赠送Maven依赖信息文件:groovy-3.0.9.pom; 包含翻译后的API文档:groovy-3.0.9-javadoc-API...
groovy-all-2.4.15.jar文件,MAC使用时需存放在/Users/用户名/.gradle/caches/jars-3/某一缓存目录下,找不到就都看一下,我遇到的问题是缓存目录中下载的是2.4.17版本,应该跟gradle版本升级有关
(1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以...
在下载并解压"apache-groovy-sdk-2.5.6.zip"后,开发者可以找到`groovy-2.5.6`目录,其中包含了Groovy的JAR文件、文档、源代码以及用于构建和运行Groovy程序的工具。通过这个SDK,开发者可以开始学习和使用Groovy,...
标题 "org.codehaus.groovy-2.9.0.xx-201407142235-e44-RELEASE-updatesite.zip" 暗示了这是一个与Groovy编程语言相关的Eclipse插件的更新站点压缩包。这个版本号 "2.9.0" 表明这是该插件的2.9.0版,时间戳 ...
org.gradle.api.resources.ResourceException: Could not get resource '...下载groovy-all-2.4.15.jar后,放入对应的 android-studio/gradle/gradle-5.*/lib/目录。 重启 Android Studio 及可使用。
如果你想以追加模式打开文件,即不覆盖已有内容,可以使用`new FileWriter('toys.txt', true)`创建一个FileWriter对象,或者在`write()`和`append()`方法调用时提供第二个参数`true`。 在实际应用中,可能还需要...
Apache Groovy SDK 2.5.15 ...了解和掌握Apache Groovy SDK 2.5.15,可以提升你在Java平台上开发的效率和灵活性,无论是编写脚本、构建自动化工具,还是开发复杂的Web应用,Groovy都能提供高效且富有表现力的编程体验。
赠送jar包:groovy-3.0.9.jar; 赠送原API文档:groovy-3.0.9-javadoc.jar; 赠送源代码:groovy-3.0.9-sources.jar; 赠送Maven依赖信息文件:groovy-3.0.9.pom; 包含翻译后的API文档:groovy-3.0.9-javadoc-API...
6. Groovy的使用场景:书中详细介绍了Groovy在多个领域的应用,包括并行和函数式编程、对象迭代方法、集合和映射增强、多线程和进程控制、文件和I/O流处理、数据库操作(SQL和NoSQL)等。 7. Web开发、测试、GUI...
TutorialsPoint Groovy 教程.epub
IDEA自带的插件Generate POJOs.groovy 比较简陋,不能生成完整的dao/mapper,切生成的POJO没有注解。没有统一格式化,所以在此基础上进行了扩展能够简单的生成pojo/dao/mapper. 使用时选择目录后会在改目录下生成...
总结来说,微服务项目中添加Groovy文件的关键在于正确配置IDE以支持Groovy,以及理解如何在项目结构中合理组织.Groovy文件。遵循上述步骤,我们可以有效地在微服务项目中利用Groovy进行动态过滤器等组件的开发,提高...
《Groovy for Domain-Specific Languages》一书由Fergal Dearle撰写,旨在探讨如何利用Groovy编程语言创建和优化领域特定语言(Domain-Specific Languages,简称DSLs),以增强和扩展Java应用程序的功能。...
groovy