РЕ: Большой XML-файл

Попробуйте изменить последний SQL-запрос на:

$get_grandtotal = mysqli_query($conn, "
SELECT SUM(L_PRICE) grand_total 
  FROM listings 
 WHERE v_ref = '$sellers[$i]' AND L_REF = '$product_ref'
");

Установите $grand_total = 0; прямо там, где открыт цикл for:

for ($i=0; $i < count($sellers); $i++) { 
        $grand_total = 0;
        $get_products = ....
        ...

И прочитайте мой комментарий выше. [116 ]

5
задан 12 revs, 5 users 43% 23 May 2017 в 12:30
поделиться

5 ответов

Существует ошибка для Java 1.6, который показывает то же самое отслеживание стека, и это откреплено на данный момент. Более новые версии Xerces, кажется, прекрасны.

Для документов это большое, которые все еще содержат изрядное количество структуры, Вы могли думать об использовании парсинга получения по запросу, т.е. парсинге частичных структур, например, с StAX.

6
ответ дан 14 December 2019 в 04:49
поделиться

Ну, данный:

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String argv[]) {
        Writer out;

        // Use an instance of ourselves as the SAX event handler
        Echo handler = new Echo();
        // Use the default (non-validating) parser
        SAXParserFactory factory = SAXParserFactory.newInstance();
        try {
            // Set up output stream
            out = new OutputStreamWriter(System.out, "UTF8");
            // Parse the input 
            SAXParser saxParser = factory.newSAXParser();
            saxParser.parse(new File("/tmp/dblp.xml"), handler);
        } catch (Throwable t) {
            t.printStackTrace();
        }
        System.out.println("Incollections = " + handler.cnt);
        System.exit(0);
    }

    static class Echo extends DefaultHandler {
        public int cnt = 0;
        @Override
        public void startElement(String namespaceURI,
                String sName, // simple name
                String qName, // qualified name
                Attributes attrs)
                throws SAXException {
            if (qName.equals("incollection")) {
                cnt = cnt + 1;
            }
        }
    }
}

Это работает на меня под Java 5, но я действительно получаю OOM под Java 6.

Я выполняю его как это:

java -DentityExpansLimit=512000 -jar xmltest.jar

И это печатает:

Incollections = 8353

Который удобен:

grep "<incollection" /tmp/dblp.xml | wc -l
8353

Так, к вашему сведению, точка данных, и т.д.

2
ответ дан 14 December 2019 в 04:49
поделиться

Кажется, существует проблема с объектами HTML в Вашем коде, а именно, "Jos&eacute;"в первом блоке. По крайней мере, мой браузер говорит мне, что существует проблема с ним, когда я открываю файл, и XMLEntityScanner обнаруживается в отслеживании стека. Я не эксперт XML, но могло случиться так, что объекты HTML на самом деле не определяются для XML в целом?

Редактирование Да, вот именно. Согласно Википедии, объектам как &eacute; определяются в DTD HTML; XML имеет только очень небольшое количество предопределенных объектов.

0
ответ дан 14 December 2019 в 04:49
поделиться

Я не знаю корректную терминологию для этого, но как "глубоко" Ваш XML идет? Например, тег "автора" в Вашем примере является 2 элементами глубоко. Если у Вас есть теги, которые действительно действительно глубоки, возможно, вот почему у Вас есть проблемы памяти?

0
ответ дан 14 December 2019 в 04:49
поделиться

Это кажется, что один из сегментов текста (или CDATA, обрабатывая инструкцию или комментарий) в XML-файле очень длинен, и синтаксический анализатор не разделяет его на несколько сегментов. Или могло случиться так, что синтаксическому анализатору не удается проанализировать объявление DOCTYPE правильно: если так, это могло бы попытаться читать все содержание XML, как будто это была часть подмножества DTD.

Но это - просто предположение. Вы упомянули попытку Stax: какая реализация? JDK 1.6 идет с Sun Sjsxp. Но Вы могли также попробовать Woodstox (http://woodstox.codehaus.org), который часто обрабатывает вещи в бите больше устойчивого пути. Таким образом, если Вы не используете Woodstox, Вы видели то, что происходит. Это действительно разделяет сегменты текста на меньшие блоки, если Вы не вызываете текстовое объединение (не значение по умолчанию).

О, и на всякий случай Вы тестировали использование ссылочная реализация Stax (http://stax.codehaus.org); это, как, к сожалению, известно, очень ошибочно. Так, чтобы мог вызвать проблемы. И Sjsxp и Woodstox являются намного лучшим выбором с Stax.

0
ответ дан 14 December 2019 в 04:49
поделиться
Другие вопросы по тегам:

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