Производительность для загрузки PDF с использованием PDFBox - PullRequest
0 голосов
/ 18 декабря 2018

Я использую API PDFBox (2.0.12) для чтения и извлечения информации из файлов PDF.У меня проблема с производительностью, которую я не мог понять.Вот моя проблема:

У меня есть набор данных из 100 файлов PDF примерно одинакового размера и с одинаковым содержанием в текстовом и графическом элементах.Я заметил, что время для чтения определенных файлов PDF может быть в 10 раз больше, чем обычное среднее время (это имеет место для 8 файлов среди 100). Обратите внимание , что я выполнил свои тесты сразу для всего набора данных, а также только для файлов, которые загружаются дольше по отдельности с теми же результатами.

Я попытался выяснить источникдолгого времени загрузки, но я не смог отследить его дальше, чем функция ProcessStream (...) класса PDFStreamEngine .

Возможно, проблема ввызвано чем-то, что требует времени для загрузки на стороне библиотеки pdfBox?Или это может быть что-то связанное с InputStream, используемым с API?

EDIT1

Например, я хочу сравнить эти два файла PDF:

pdf1 pdf1

pdf2 pdf2

Вот некоторые результаты для цикла чтениядва файла 5 раз.Я даже изменил порядок чтения обоих PDF-файлов, но получил те же результаты.

|             |    PDF1     |     PDF2     |
|:----------- |------------:|:------------:|
| Reading time|  2077.67 ms | 128881.48 ms |
|  avg 5 run  |             |              |
|-------------|-------------|--------------|  
| size        |    9.6 Mo   |    924.5 kB  |

Вот пример кода, который я использую для чтения файлов:

@Override
public void processFile() throws IOException, ExtractionException {

    TextComparator.chrono.start("Extraction " + key , 2 );
    log.info("Start Extraction " + key + "...");

    TextComparator.chrono.start("Reading raw " + key, 3);

    try {

        this.document = PDDocument.load(new File(path));
        setSuppressDuplicateOverlappingText(true);
        setShouldSeparateByBeads(true);
        setStartPage(0);
        setEndPage(document.getNumberOfPages());

        //Rotating the pdf page
        for (int i = 0; i < document.getNumberOfPages(); i++)
            document.getPage(i).setRotation(0);

        Writer dummy = new OutputStreamWriter(new ByteArrayOutputStream());   

        // Reading
        writeText(document, dummy);

        TextComparator.chrono.close("Reading raw " + key);

        TextComparator.chrono.start("Refining " + key, 3);


        log.info("---Number of extracted raw lines      : " + rawLines.size() );
        log.info("---Number of extracted cut lines      : " + nbCutLine );
        log.info("---Number of extracted raw paragraphs : " + paragraphs.size() );

    } catch (IOException e) {
        throw e;
    } catch (ExtractionException e) {
        throw e;
    } catch (Exception e) {
        throw new ExtractionException(fileName, e.getMessage());
    } finally {
        if (document != null) {
            document.close();
        }
    }   
}

Приведенный выше метод является частью моего собственного класса, который расширяет PDFTextStripper класс библиотеки PDFBox.Основной частью этого метода является функция writeText (.,.), Которая является частью библиотеки PDFBox.Он вызывает внутри себя некоторые другие функции, которые я мог отследить, переопределив их и вызвав суперфункцию родительского класса.Я поднялся до функции ProcessStream класса PDFStreamEngine , которую я не мог переопределить, поскольку она на два класса выше по иерархии по сравнению с моим собственным классом.

Edit2

Ниже приведены два графика, обобщающие мои тесты производительности:

plot1: время загрузки (логарифмическая шкала) для набора файлов PDF (почти 220 файлов) как функция порядка извлечения (вызов заказа1 означает, что это первый загруженный pdf, 50 означает, что это самый загруженный pdf и т. Д.).Размер представлен спектром цвета слева.

enter image description here

plot2 + 3: для двух разных PDF-файлов я выполнял извлечение около 220 раз.

plot2 enter image description here Я также заметил, что при получении одного и того же файла и многократном извлечении первое извлечение происходит в 5 раз медленнее, чем почтивсе следующие извлечения.

Есть ли какие-либо подсказки о других параметрах, которые могут повлиять на производительность извлечения?

Большое спасибо,

...