Sax-парсер И Большой Xml-файл

  • Автор темы codebyner
  • Дата начала
C

codebyner

#1
Здравствуйте форумчане.

Заглянул к вам в поисках ответа на один вопрос.
В общем я пытаюсь распарсить большой xml-файл (около 1 Гб) и перенести его структуру в MySql.
Так надо! )

С небольшими файлами программа работает нормально. Но когда передаю ей большой файл, то после длительной работы (мин. 30 - 60 может больше) программа прекращает работу, без каких-либо StackTrace`ов и выводов в консоль. Если запустить под дебагом, то в результате - "Source not found".
В названии таба написано:
XIncludeAwareParserConfiguration(XML11Configuration).parse(XMLInputSourse) line: 768

В гугле смотрел, ничего вразумительного не нашел.
Может быть кто-нибудь сталкивался с такой проблемой.

P.S.
Работаю в Eclipse под Linux. На всякий случай.
 

savl

Lotus team
28.10.2011
2 131
102
#2
Может парсер сменить? Если конечно это не сильно сложно в рамках архитектуры приложения.
VTD-XML
или
XOM

А так еще можно постоянно логировать действия, поискать после какой итерации или на каком документе выпадает.
 
C

codebyner

#3
Разобрался с проблемой, уже давно правда. Редко сюда захожу.
Смотрю на свой пост и думаю, как я мог так написать. Сам с трудом припоминаю в чем была проблема. Информации в сообщении почти никакой))

Ну судя по всему я тогда использовал SAX-парсер. Так как думаю обычный загнулся бы еще на старте)
Значит, проблема была в том, что у меня заканчивалась память в стеке. Я неправильно работал с базой данных. Оказывается нужно освобождать определенные ресурсы самому, после выполнения запроса.

С базой я работал через com.mysql.jdbc.Driver.

Пример кода, который освобождает ресурсы.

C++:
public boolean query(String query){
Statement s = null;
boolean result = false;

try {
s = connection.createStatement();
s.execute(query);
result = true;
}
catch (SQLException e) {
lastError = e.getMessage();
e.printStackTrace();
}
finally {
if(s != null){
try {
s.close();
}
catch (SQLException e) {
e.printStackTrace();
}
}
}

return result;
}
Кроме того если вы получаете ссылку на объект ResultSet, то его тоже необходимо закрыть после использования.

C++:
ResultSet result = selectStatement.executeQuery(query);