Извлечь часть файла XML [duplicate]

Как указано @andrewdotn, лучший способ - увидеть подробную ошибку (SHOW ENGINE INNODB STATUS;) вместо кода ошибки.

Одна из причин может заключаться в том, что индекс уже существует с тем же имя, может быть в другой таблице. Как практика, я рекомендую имя таблицы префикса перед именем индекса, чтобы избежать таких столкновений. например вместо idx_userId используйте idx_userActionMapping_userId.

14
задан ThinkingStiff 15 March 2013 в 19:20
поделиться

9 ответов

Помимо рекомендуемого анализа SAX, вы можете использовать StAX API (вид эволюции SAX), включенный в JDK (пакет javax.xml.stream).

19
ответ дан Duncan Jones 27 August 2018 в 21:41
поделиться

У меня была аналогичная проблема - мне пришлось прочитать целый XML-файл и создать структуру данных в памяти. В этой структуре данных (все должно было быть загружено) мне пришлось выполнять различные операции. Многие элементы XML содержали текст (который я должен был выводить в своем выходном файле, но не был важен для алгоритма).

В общем, как было предложено здесь, я использовал SAX для анализа файла и создайте мою структуру данных. Мой файл был 4 ГБ, и у меня была 8-гигабайтная машина, поэтому я подумал, что, возможно, 3 ГБ файла - это просто текст, а для java.lang.String, вероятно, потребуется 6 ГБ для этого текста, используя его UTF-16.

JVM занимает больше места, чем компьютер имеет физическую RAM, тогда машина будет меняться. Выполнение сбора мусора с меткой + sweep приведет к тому, что страницы получат доступ в случайном порядке, а также объекты, перемещаемые из одного пула объектов в другой, что в основном убивает машину.

Поэтому я решил написать все мои строки выходят на диск в файле (FS, очевидно, может обрабатывать последовательную запись 3GB в порядке, а при чтении в ОС будет использовать доступную память для кеша файловой системы, все равно могут быть прочитаны с произвольным доступом но меньше, чем GC в java). Я создал небольшой вспомогательный класс, который вы более чем можете скачать, если он вам поможет: StringsFile javadoc | Загрузить ZIP .

StringsFile file = new StringsFile();
StringInFile str = file.newString("abc");        // writes string to file
System.out.println("str is: " + str.toString()); // fetches string from file
1
ответ дан Adrian Smith 27 August 2018 в 21:41
поделиться

Используйте синтаксический анализатор на основе SAX, который представляет вам содержимое документа в потоке событий.

10
ответ дан andrewmu 27 August 2018 в 21:41
поделиться

+1 для StaX. Это проще в использовании, чем SaX, потому что вам не нужно писать обратные вызовы (вы, по сути, просто перебираете все элементы времени, пока не закончите), и у него (AFAIK) нет ограничений по размеру файлов, которые он может обрабатывать .

0
ответ дан Chris W 27 August 2018 в 21:41
поделиться

Попробуйте VTD-XML . Я обнаружил, что он более эффективен и, что более важно, проще в использовании, чем SAX.

3
ответ дан dogbane 27 August 2018 в 21:41
поделиться

API StAX проще справляться с SAX. Вот небольшой учебник

4
ответ дан Eugene Kuleshov 27 August 2018 в 21:41
поделиться

Поток файла в синтаксический анализатор SAX и считывание его в память в кусках.

SAX дает вам много контроля и имеет смысл управлять событиями. Апи немного сложно понять, вам нужно обратить внимание на некоторые вещи, например, когда вызывается метод characters (), но основная идея заключается в том, что вы пишете обработчик содержимого, который вызывается, когда начинается и заканчивается каждый читается элемент xml. Таким образом, вы можете отслеживать текущий xpath в документе, определять, какие пути имеют данные, которые вас интересуют, и определить, какой путь обозначает конец фрагмента, который вы хотите сохранить или передать или каким-либо другим способом.

3
ответ дан Nathan Hughes 27 August 2018 в 21:41
поделиться

Используйте почти любой SAX Parser для потоковой передачи файла за раз.

1
ответ дан Nick Fortescue 27 August 2018 в 21:41
поделиться

Как говорили другие, используйте синтаксический анализатор SAX, так как это потоковый анализатор. Используя различные события, вы извлекаете свою информацию по мере необходимости, а затем на лету хранят ее где-то еще (база данных, другой файл, что у вас есть).

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

Если вы буферизируетесь в БД, убедитесь, что проявляете осторожность, чтобы сделать ваш процесс перезагруженным или каким-либо другим. Многое может случиться в 1,8 ГБ, что может потерпеть неудачу посередине.

3
ответ дан Will Hartung 27 August 2018 в 21:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: