Как оптимизировать рутину загрузки с помощью Delphi 2010?

StackOverflow https://stackoverflow.com/questions/9476744

Вопрос

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

  1. разделенный файл на "ломтики" (256kb каждый)
  2. для каждого ломтика, опубликуйте его на сервер

    IE. Для файла 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) использовал свой профилировщик снова и снова, и не осталось, чтобы оптимизировать, за исключением изменения самой процедуры загрузки.

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

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

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

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

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

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

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

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

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

Это было полезно?

Решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top