我不得不承认,我对ANT并不熟悉,下面的大部分代码都不是从头开始写的。我想做的是循环浏览一个文件名列表,该列表保存在一个用逗号分隔的文件中。代码执行良好,直到到达第1400个文件名附近。对于每个文件名,它都调用一个java过程,该过程执行查询以检索pdf文件并将其保存在本地。我认为它可能内存不足,因为在Java过程中打开的连接没有关闭,但我确认是关闭的。所以我认为这是由于文件名列表太大。关于如何处理大名单有什么想法吗?
我在第1400次迭代后得到的错误是java.lang.OutOfMemoryError:无法创建新的本地线程
谢谢。
<for list="${filenames}" delimiter="," param="filename">
<sequential>
<propertyregex override="yes" property="trimmedname" input="@{filename}" regexp="[s]*([^s].*[^s])[s]*" replace="1"/>
<if>
<and>
<length string="${trimmedname}" trim="true" when="greater" length="0" />
<not><equals arg1="${trimmedname}" arg2="$${filenames}" /></not>
</and>
<then>
<java classname="LOBExtract" failonerror="true" fork="true" maxmemory="512m">
<arg value="DBSERVER=${server_name}"/>
<arg value="DBPORT=${oracle_port}"/>
<arg value="DBSID=${oracle_sid}"/>
<arg value="DBUSER=${dbuser}"/>
<arg value="DBPASSWORD=${dbpassword}"/>
<arg value="TABLE=BLOB_DATA"/>
<arg value="LOBFIELD=BLOB_DATA"/>
<arg value="WHERE=blob_id=${trimmedname}"/>
<arg value="FILENAME=${output_dir}/aircraft/esig/files/${trimmedname}.pdf"/>
<classpath>
<pathelement location="."/>
<pathelement path="${basedir}"/>
<pathelement path="${basedir}/resource/ojdbc14.jar"/>
</classpath>
</java>
</then>
</if>
</sequential>
</for>
与使用List或arrayList相比,使用某种哈希对大型数据集更有效。