`
winnerbao
  • 浏览: 10381 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Groovy File.append很慢,因为每次都要打开/关闭文件

 
阅读更多

[介绍]

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-3.0.jar

    Groovy jar包 3.0.

    groovy-3.0.9-API文档-中英对照版.zip

    赠送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...

    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版本,希望大家多多下载,apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本,希望...

    groovy-3.0.9-API文档-中文版.zip

    赠送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.zip

    groovy-all-2.4.15.jar文件,MAC使用时需存放在/Users/用户名/.gradle/caches/jars-3/某一缓存目录下,找不到就都看一下,我遇到的问题是缓存目录中下载的是2.4.17版本,应该跟gradle版本升级有关

    groovy-all-1.7.6.jar中文-英文对照文档.zip

    (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以...

    org.codehaus.groovy-2.9.0.xx-201407142235-e44-RELEASE-updatesite.zip

    标题 "org.codehaus.groovy-2.9.0.xx-201407142235-e44-RELEASE-updatesite.zip" 暗示了这是一个与Groovy编程语言相关的Eclipse插件的更新站点压缩包。这个版本号 "2.9.0" 表明这是该插件的2.9.0版,时间戳 ...

    groovy-all-2.4.15.jar

    org.gradle.api.resources.ResourceException: Could not get resource '...下载groovy-all-2.4.15.jar后,放入对应的 android-studio/gradle/gradle-5.*/lib/目录。 重启 Android Studio 及可使用。

    [Groovy入门]第七讲.将玩具信息写到文件

    如果你想以追加模式打开文件,即不覆盖已有内容,可以使用`new FileWriter('toys.txt', true)`创建一个FileWriter对象,或者在`write()`和`append()`方法调用时提供第二个参数`true`。 在实际应用中,可能还需要...

    apache-groovy-sdk-2.5.15.zip

    Apache Groovy SDK 2.5.15 ...了解和掌握Apache Groovy SDK 2.5.15,可以提升你在Java平台上开发的效率和灵活性,无论是编写脚本、构建自动化工具,还是开发复杂的Web应用,Groovy都能提供高效且富有表现力的编程体验。

    apache-groovy-sdk-2.5.6.zip

    在下载并解压"apache-groovy-sdk-2.5.6.zip"后,开发者可以找到`groovy-2.5.6`目录,其中包含了Groovy的JAR文件、文档、源代码以及用于构建和运行Groovy程序的工具。通过这个SDK,开发者可以开始学习和使用Groovy,...

    TutorialsPoint Groovy 教程.epub

    TutorialsPoint Groovy 教程.epub

    IDEA逆向生成POJO/DAO/MAPPER 《Generate POJOs.groovy》

    IDEA自带的插件Generate POJOs.groovy 比较简陋,不能生成完整的dao/mapper,切生成的POJO没有注解。没有统一格式化,所以在此基础上进行了扩展能够简单的生成pojo/dao/mapper. 使用时选择目录后会在改目录下生成...

    Groovy.in.Action.2nd.Edition.pdf

    6. Groovy的使用场景:书中详细介绍了Groovy在多个领域的应用,包括并行和函数式编程、对象迭代方法、集合和映射增强、多线程和进程控制、文件和I/O流处理、数据库操作(SQL和NoSQL)等。 7. Web开发、测试、GUI...

    微服务项目中添加groovy文件技巧.docx

    总结来说,微服务项目中添加Groovy文件的关键在于正确配置IDE以支持Groovy,以及理解如何在项目结构中合理组织.Groovy文件。遵循上述步骤,我们可以有效地在微服务项目中利用Groovy进行动态过滤器等组件的开发,提高...

    Groovy.for.Domain.Specific.Languages.pdf

    《Groovy for Domain-Specific Languages》一书由Fergal Dearle撰写,旨在探讨如何利用Groovy编程语言创建和优化领域特定语言(Domain-Specific Languages,简称DSLs),以增强和扩展Java应用程序的功能。...

    apache-groovy-sdk-4.0.1下载

    Apache Groovy SDK 4.0.1 是一个重要的软件开发工具包,专为使用Groovy编程语言进行开发的程序员设计。Groovy是一种基于Java平台的动态、灵活的编程语言,它扩展了Java语言的功能,提供了简洁的语法和强大的元编程...

Global site tag (gtag.js) - Google Analytics