Как оптимизировать процедуру загрузки с помощью Delphi 2010? - PullRequest
7 голосов
/ 28 февраля 2012

Моя еще не выпущена Приложение Delphi 2010 позволяет пользователям загружать свои файлы на мои серверы.Прямо сейчас я использую HTTPS POST для отправки файлов, (упрощенный) алгоритм в основном:

  1. Разделить файл на «кусочки» (256 КБ каждый)
  2. Для каждого среза,Отправьте его на сервер

т.е.для файла размером 1 МБ:

--> Get Slice #1 (256KB)
--> Upload Slice #1 using TidHTTP.Post()

--> Get Slice #2 (256KB)
--> Upload Slice #2 using TidHTTP.Post()

--> Get Slice #3 (256KB)
--> Upload Slice #3 using TidHTTP.Post()

--> Get Slice #4 (256KB)
--> Upload Slice #4 using TidHTTP.Post()

Я использую Indy 10 .Я (ab) использовал свой профилировщик снова и снова, и не осталось ничего для оптимизации, кроме изменения самой процедуры загрузки.

Я также использую многопоточность , и хотя ясделал все возможное, чтобы оптимизировать мой код, мои тесты все еще говорят мне, что я могу добиться большего успеха (есть другие хорошо оптимизированные программы, которые достигают намного лучшего времени ... почти в два раза быстрее, чем моя процедура загрузки!)

Я знаю, что это не ошибка моего сервера ... вот идеи, которые мне еще нужно изучить:

  1. Я попытался сгруппировать фрагменты в одном POST, естественно этопривело к увеличению производительности (20-35%), но возможности возобновления теперь уменьшены.

  2. Я также думал об использовании SFTP / SSH, но я не уверен, что это быстро.

  3. Используйте веб-сокеты для реализации возобновляемой загрузки (например, этот компонент ), я тоже не уверен в скорости.

Теперь мой вопрос: что я могу сделать, чтобы ускорить загрузку?Я открыт для любого предложения, которое я могу реализовать, включая инструменты командной строки (если лицензия позволяет мне поставлять его вместе с моим приложением), при условии, что:

  1. Поддерживается возобновляемая загрузка
  2. Быстро!
  3. Разумное использование памяти
  4. Защита и разрешение входа в систему / аутентификация пользователя

Кроме того, из-за серьезных проблем безопасности FTP являетсяне то, что я хотел бы реализовать.

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

1 Ответ

5 голосов
/ 29 февраля 2012

Я бы предложил сделать один TIdHTTP.Post() для всего файла, не разбивая его на части. Вы можете использовать события TIdHTTP.OnWork... для отслеживания того, сколько байтов было отправлено на сервер, чтобы вы знали, где возобновить работу, если это необходимо. При возобновлении можно использовать свойство TIdHTTP.Request.CustomHeaders для включения настраиваемого заголовка, который сообщает серверу, с которого вы возобновляете работу, чтобы он мог откатить свой предыдущий файл до указанного смещения, прежде чем принимать новые данные.

...