В настоящее время я использую TIdHTTP
в Delphi 11 для автоматической загрузки обновлений моего программного обеспечения. Мой установщик относительно большой (около 100 МБ), и загрузка занимает пару минут или даже больше.
Предположим, у меня есть один и тот же установочный файл на разных серверах, есть ли способ использовать все эти серверы для повышения скорости загрузки, что-то вроде Torrent?
Можно также запустить несколько загрузок с одного и того же сервера, если он ограничивает пропускную способность только для каждой загрузки, а не для каждого запрашивающего клиента: загружать 3 части параллельно и иметь в 3 раза большую скорость, если у клиента такая большая емкость. Еще почитать: Разница между заголовками Content-Range и Range? и Заголовок диапазона HTTP и Какой диапазон байтов 0- означает и Запрос диапазона HTTP для последнего байта
@DavidHeffernan Узким местом является сервер, потому что это общий сервер, поэтому я хочу попробовать метод «торрент».
Торрент работает, загружая отдельные фрагменты файла из нескольких источников параллельно, а затем объединяя фрагменты в окончательный файл.
Вы можете сделать это и с TIdHTTP
, если все серверы (или даже только 1 сервер) поддерживают заголовок HTTP Range request. Так, например, вы можете загрузить файл фрагментами по 1 КБ, загрузив диапазоны байтов 0-1023
, 1024-2047
, 2048-3071
и так далее до последнего фрагмента.
Если ваши серверы поддерживают это, вы можете сделать следующее:
TIdHTTP
.TFileStream
1 для конечного файла, запрашивая и предоставляя доступ/права на чтение/запись, а затем ищите его до желаемого начального смещения для фрагмента в файле.TFileStream
, задав для свойства TIdHTTP.Request.Range
значение 'bytes=<start>-<end>'
, где start
— начальное смещение, а end
— конечное смещение фрагмента в файле.1 ОБНОВЛЕНИЕ: О, подождите, я забыл, что TIdHTTP
(точнее, TIdIOHandler.ReadStream()
) изменяет размер данного TStream
до размера загружаемых данных, если этот размер сообщается сервером (что было бы в этой ситуации). Вы НЕ хотите, чтобы это произошло, если вы уже заранее определили размер целевого файла, иначе он будет усечен / поврежден, если вы загрузите несколько TFileStream
в один и тот же файл. Таким образом, вы не можете использовать стандартный TFileStream
здесь. Однако вы можете создать новый класс из TFileStream
и переопределить его виртуальные SetSize()
методы, чтобы они ничего не делали. Это должно сработать, я думаю.
В качестве альтернативы:
TIdHTTP
.TFileStream
(здесь подойдет стандартный TFileStream
) в отдельный временный файл, запрашивая доступ только для записи и не предоставляя никаких прав, и не ищите его.TFileStream
, настроив TIdHTTP.Request.Range
как описано выше.За все годы я никогда не читал и не придумал термин «предварительный размер», чтобы точно описать, что файл должен резервировать больше места, чем он собирается записать в это время (см. Как вы предварительно выделяете место для файла в C /С++ в Windows?)
Ой, подождите, я забыл, что у подхода с предварительным размером возникнут проблемы при использовании стандартного TFileStream
. Я обновил свой ответ, чтобы решить эту проблему.
Где узкое место? Сервер, который является сервером, — это файл bg или ваш домашний широкополосный доступ. Если это последнее, то все, что вы можете сделать, это улучшить широкополосный доступ. Найдите узкое место.