Ужасная производительность при конвертации 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