Optimization 在Groovy中加快选择和写入文件的速度

Optimization 在Groovy中加快选择和写入文件的速度,optimization,groovy,Optimization,Groovy,我有一个非常简单的groovy代码: sql.eachRow("""SELECT LOOP_ID, FLD_1, ... 20 more fields FLD_20 FROM MY_TABLE ORDER BY LOOP_ID"""){ res-> if(oldLoopId != res.loop_id){ oldLoopId = res.loop_id fil

我有一个非常简单的groovy代码:

sql.eachRow("""SELECT 
        LOOP_ID,
        FLD_1,
        ... 20 more fields 
        FLD_20  
        FROM MY_TABLE ORDER BY LOOP_ID"""){ res->

    if(oldLoopId != res.loop_id){
        oldLoopId = res.loop_id
        fileToWrite = new File("MYNAME_${type}_${res.loop_id}_${today.format('YYYYmmDDhhMM')}.txt")
        fileToWrite.append("20 fields header\n")
    }

    fileToWrite.append("${res.FLD_1}|${res.FLD_2}| ... |${res.FLD_20}\n");
}

}
它从表中选择内容并写入数据库。它为每个新的循环id创建一个新文件。问题是写50mb的文件大约需要15分钟

我如何使它更快

尝试写入,而不是直接使用
append

    sql.eachRow("""SELECT 
        LOOP_ID,
        FLD_1,
        ... 20 more fields 
        FLD_20  
        FROM MY_TABLE ORDER BY LOOP_ID""") { res ->

    def writer
    if (oldLoopId != res.loop_id) {
        oldLoopId = res.loop_id
        def fileToWrite = new File("MYNAME_${type}_${res.loop_id}_${today.format('YYYYmmDDhhMM')}.txt")
        if (writer != null)  { writer.close() }
        writer = fileToWrite.newWriter()
        writer.append("20 fields header\n")
    }

    writer.append("${res.FLD_1}|${res.FLD_2}| ... |${res.FLD_20}\n");
File::withWriter
自动关闭资源,但要使用它,您需要执行更多的trips do DB,获取所有的
循环id
并获取每个循环的数据


以下脚本:

f=new File("b.txt")
f.write ""
(10 * 1024 * 1024).times { f.append "b" }
执行:

$ time groovy Appends.groovy

real    1m9.217s
user    0m45.375s
sys 0m31.902s
$ time groovy Writes.groovy

real    0m1.774s
user    0m1.688s
sys 0m0.872s
并使用
BufferedWriter

w = new File("/tmp/a.txt").newWriter()
(10 * 1024 * 1024).times { w.write "a" }
执行:

$ time groovy Appends.groovy

real    1m9.217s
user    0m45.375s
sys 0m31.902s
$ time groovy Writes.groovy

real    0m1.774s
user    0m1.688s
sys 0m0.872s

File.append打开一个编写器,转到文件的末尾,然后写一行。取而代之的是,为新文件创建一个writer并写入它(记住在创建新writer之前关闭它)。我尝试了它,虽然速度更快,但仍然非常慢。每50mb数据需要4分钟。也许它正在穿过光标,速度很慢?我可以加快速度吗?您可以对文件写入进行注释以检查速度,但我几乎可以肯定,是文件写入速度变慢了。您不应该
def writer
跳出闭包,因为它将由所有调用共享吗?