2012-03-08 30 views
0

我不得不承認我對ANT不熟悉,也沒有寫下面的大部分代碼刮。我試圖做的是循環遍歷一個文件名列表,這些文件名保存在一個用逗號分隔的文件中。代碼執行得很好,直到它到達第1400個文件名的某處。對於每個文件名,它調用一個執行查詢的java過程來檢索pdf文件並將其保存到本地。我相信它可能會耗盡內存,因爲在Java過程中打開的連接沒有關閉,但我確認它是。所以我認爲它歸因於文件名列表太大。關於如何處理大型列表的任何想法?在ANT中循環遍歷大列表的for循環導致java.lang.OutOfMemoryError:無法創建新的本地線程

我拿到後周圍的第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> 
+0

是否刪除'fork =「true」'改變任何東西? – doublep 2012-03-08 22:56:30

+0

你可以給更多的內存,比如maxmemory =「1200m」。 Ant是否提供OOM或LOBExtract? – Jayan 2012-03-09 05:20:55

+0

螞蟻正在給OOM。它呼籲LOBExtract說它不能創建一個新的線程崩潰。 – noghead 2012-03-09 15:21:15

回答

0

與使用List或arrayList相比,使用某種散列對大數據集更有效。