Цикл for, который перебирает большой список в ANT, вызывает java.lang.OutOfMemoryError: невозможно создать новый собственный поток - PullRequest
0 голосов
/ 09 марта 2012

Я должен признать, что я не знаком с 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>

1 Ответ

0 голосов
/ 15 апреля 2015

Использование некоторого вида хеша более эффективно для больших наборов данных по сравнению с использованием List или arrayList.

...