在ANT中循环通过大列表的for循环导致java.lang.OutOfMemoryError:无法创建新的本机线程



我不得不承认,我对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相比,使用某种哈希对大型数据集更有效。

相关内容

  • 没有找到相关文章

最新更新