Ужасная производительность при конвертации PDF в изображения

Я поставил задачу конвертировать отдельные страницы PDF в JPEG.

Используя Magick.NET, я смог получить очень приличную скорость конвертации на любом локальном компьютере, на котором работал мой проект.

Моя живая среда находится под Amazon Elastic Beanstalk, используя экземпляр EC2. Это экземпляр t1.micro с 615 МБ оперативной памяти и процессором стоимостью ~1,83 ГГц.

Когда мой проект был развернут, я использовал Magick.NET x86 Q16, Ghostscript x86, а также Visual C++ Redistributable VS2012 x86 как на моем компьютере, так и на сервере.

Код загружает PDF из S3 Bucket и сохраняет его локально, следовательно, преобразование также происходит локально.

Вот где это начинает становиться странным.

Время для тестового преобразования #1 (у меня также есть окно RDP, открытое для сервера для мониторинга):

  • Нажмите на мой красивый и блестящий Split to images кнопка
  • Загрузка заканчивается почти в одно мгновение
  • image.Read() там, где он читает PDF, требуется ОЧЕНЬ много времени (иногда между 2-8 минутами), и каждый раз мой браузер отвечает пустой (белой) страницей.
  • Я оставляю белую страницу браузера без изменений и продолжаю следить за сервером. В папке, в которой происходит преобразование, сервер МЕДЛЕННО начинает записывать каждое изображение размером 60 КБ в папку (для 6-страничного PDF-файла размером 1,7 МБ весь этот процесс может занять от 5 до 15 минут, а сервер работает крайне медленно. в то время, а также немного позже)

Тестовая конверсия № 2:

  • Заменено все, что упомянуто в описании выше, на его версию x64. То же самое.

Тестовая конверсия № 3/ № 4:

  • Заменил Magick.NET x86 / x64 Q16 на Magick.NET x86 / x64 Q8

Снова то же самое.

Во время каждого преобразования процессор на 100% и память около 70%

Мой код выглядит следующим образом:

Dim response As GetObjectResponse = client.GetObject(req)

Try

    Using response
        Dim dest As String = Path.Combine(Server.MapPath("~/S3"), EnvName)

        If Not File.Exists(dest) Then
            response.WriteResponseStreamToFile(dest)
        End If
    End Using

    Dim settings As New MagickReadSettings
    settings.Density = New MagickGeometry(300, 300)

    Dim images As New MagickImageCollection

    Using images
        images.Read(Server.MapPath("~/S3/" & EnvName & ""), settings)

        Dim pageCount As Integer = 1

        For Each img As MagickImage In images

            img.Resize(700, 900)
            img.Format = MagickFormat.Jpeg
            img.Trim()
            img.Write("~/S3/" & EnvName & "_Page_" & pageCount & ".jpeg")

            Literal1.Text &= "Page " & pageCount & " is done" 'For debugging purposes
            pageCount += 1
        Next

        Literal1.Text &= "Success"
    End Using

Catch ex As Exception
    Literal1.Text = ex.ToString
End Try

2 ответа

Решение

Микроэкземпляры T1 - это эквивалентная мощность ноутбука очень низкого уровня, который вы покупаете в Walmart (почти) - не говоря уже о том, что они не очень полезны для многих вещей, но высокая производительность, интенсивная обработка процессора в среде Windows не один из них.

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

Возможно, вы захотите перейти на использование новых PDF API, которые поставляются с окнами. Надежно и быстро.

http://msdn.microsoft.com/en-US/library/windows/apps/windows.data.pdf.aspx

Другие вопросы по тегам