Optimization 在Groovy中加快选择和写入文件的速度
我有一个非常简单的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
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
跳出闭包,因为它将由所有调用共享吗?