подобрете скоростта на трансфер с Indy

Трябва да прехвърля много файлове от един tcp indy сървър към клиент с помощта на компоненти INDY10. Има ли начин да се подобри скоростта на трансфер чрез задаване на който и да е параметър за комуникацията TCP клиент или сървър.

Размер на файла: ~ 10 MBYte .... 50 Mybte

Има ли ограничение по отношение на размера на файла, компютърът ми използва WIN 7 x64 и 32 GBYTE RAM. Нашата мрежа е 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
IMHO Единственото подобрение на скоростта, което можете да постигнете, всъщност е изпращането на по-малко байтове по кабела чрез компресиране (ако изходният файл е компресируем, разбира се)   -  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