улучшить скорость передачи с Indy

Мне нужно передать много файлов с одного сервера tcp indy на клиент с использованием компонентов INDY10. Есть ли способ улучшить скорость передачи, установив какой-либо параметр для TCP-клиента или связи с сервером.

Размер файла : ~ 10 Мбайт .... 50 Мбайт

Есть ли ограничение в отношении размера файла, мой компьютер использует WIN 7 x64 и 32 ГБ ОЗУ Наша сеть - LAN.100 другое местоположение LAN уже улучшено до GIGABIT LAN

  function SendStream(AContext: TIdContext; AStream: TStream): Boolean; overload;
  var
    StreamSize: LongInt;
  begin
    try
      Result := True;
      try
        StreamSize := (AStream.Size);

        // AStream.Seek(0, soFromBeginning);

        AContext.Connection.IOHandler.Write(LongInt(StreamSize));
        AContext.Connection.IOHandler.WriteBufferOpen;
        AContext.Connection.IOHandler.Write(AStream, 0, False);
        AContext.Connection.IOHandler.WriteBufferFlush;
      finally
        AContext.Connection.IOHandler.WriteBufferClose;
      end;
    except
      Result := False;
    end;
  end;

person user1769184    schedule 01.12.2012    source источник
comment
Вы не опубликовали абсолютно никакого кода или полезной информации, которую мы могли бы использовать, чтобы попытаться вам помочь. Неважно, используете ли вы Win7 64 или какого размера файл у вас есть; без кода мы не можем сказать вам, делаете ли вы что-то не так или что вы можете сделать, чтобы исправить это, поскольку мы понятия не имеем, что вы делаете сейчас. Кроме того, вам не нужно размещать информацию о тегах в заголовке — система тегов здесь работает очень хорошо и не требует никакой помощи. :-)   -  person Ken White    schedule 02.12.2012
comment
Или какая скорость у вас сейчас. Он может быть уже максимальным, учитывая накладные расходы TCP/IP.   -  person Marco van de Voort    schedule 02.12.2012
comment
Покажите код и фактические числа, чтобы установить базовый уровень.   -  person jachguate    schedule 02.12.2012
comment
Хорошее редактирование, но вы все еще не говорите нам, какова ваша текущая скорость передачи?   -  person jachguate    schedule 03.12.2012
comment
ИМХО Единственное улучшение скорости, которого вы можете добиться, - это на самом деле отправлять меньше байтов по проводу с помощью сжатия (если исходный файл сжимаем).   -  person whosrdaddy    schedule 03.12.2012
comment
Клиентский код тоже может быть узким местом, или он так же прост, как серверный код (см. выше)?   -  person mjn    schedule 03.12.2012


Ответы (2)


Код отправки можно сократить до

  function SendStream(AContext: TIdContext; AStream: TStream): Boolean;
  begin
    Result := True;
    try
      AContext.Connection.IOHandler.Write(AStream, 0, True);
    except
      Result := False;
    end;
  end;

Третий параметр заставляет Indy записать размер потока в виде значения Integer или Int64 (в зависимости от значения свойства TIdIOHandler.LargeStream) клиенту.

Затем клиент может прочитать размер потока и поток, используя

// reads the stream size then reads the stream data
Client.IOHandler.ReadStream(MyStream, -1, False);

(найдено в Delphi TidTCPServer и TidTCPClient, передающих запись, где только передача направление изменилось)

person mjn    schedule 03.12.2012

Отправьте поток напрямую и сохраните еще одну копию создаваемых байтов. В частности, в вашем примере - удалите 3 строки кода, в которых упоминается WriteBuffer.

В зависимости от размера потока и количества одновременных клиентов, вы можете перегружать свой диспетчер памяти, используя большую буферизованную копию, которая вам на самом деле не нужна. Ваша цель при больших передачах — ограничить количество раз, когда что-то должно обрабатывать весь поток.

person Darian Miller    schedule 02.12.2012
comment
Я # попробую ваши предложения - person user1769184; 03.12.2012