Delphi (DataSnap) Медленно

Недавно я начал использовать DataSnap в Delphi для создания веб-службы RESTful. После того, как я следовал руководствам самого Марко Канту и нескольких других в Интернете, я успешно запустил всю «цепочку».

Но есть небольшая проблема со скоростью; теперь клиент может отправить поток (вместе с его размером) на сервер (который из-за ошибки здесь Параметры метода DataSnap XE2 и TStream, считываются до отправленного размера), и сервер повторно соберет его в файл и сохранит на диске.

Но для файла 3,66 МБ это занимает более 50 секунд!

Должно ли быть так? На сервере у меня есть:

try
   F := TFileStream.Create('written.dat', fmCreate);
   F.Position := 0;
   F.CopyFrom(Data, DataSize);
finally 
   F.Free; 

И на стороне клиента:

var
  Server: TServerMethods1Client;
  DBStream: TFileStream;
begin
  Server := TServerMethods1Client.Create(SQLConnection1.DBXConnection);
  try
    DBStream := TFileStream.Create('DataSnapServer.exe', fmOpenRead);
    DBStream.Position := 0;
    Showmessage(IntToStr(Server.SendData(DBStream, DBStream.Size)));
  finally
    Server.Free;

Любая помощь приветствуется!

Привет, Адриан


person Adrian    schedule 10.09.2012    source источник
comment
Должно ли это быть так? Нет, но это может быть проблема с сетью. Что произойдет, если вы просто скопируете файл такого размера на сервер? Что вы видите, если пинговаете / отслеживаете сервер?   -  person GolezTrol    schedule 10.09.2012
comment
К сожалению, оба находятся на одном компьютере; то есть подключение к localhost   -  person Adrian    schedule 10.09.2012
comment
Похоже на ошибку реализации: ожидая истечения времени ожидания, затем обрезаем возвращаемый контент. Он должен обрабатывать HTTP-заголовок Content-Length.   -  person Arnaud Bouchez    schedule 10.09.2012
comment
Не ответ, но сказать, что это возможно: наша структура mORMot RESTFul обрабатывает настраиваемое содержимое потока, как ожидалось, только через interface-определенные службы (нет необходимости проходить через все сантехнические схемы и мастера DataSnap, а также с очень хорошая скорость) - он даже может использовать http://synopse.info/forum/search.php?search_id=613347850 без копии в памяти пользователя.   -  person Arnaud Bouchez    schedule 10.09.2012
comment
Поскольку вы пишете файл .exe, может ли быть, что сканер вирусов агрессивно сканирует файл во время его записи? Я думаю, что TFileStream автоматически буферизует чтение и запись на 4 КБ, что может вызвать большое количество повторных сканирований во время записи файла.   -  person GolezTrol    schedule 10.09.2012
comment
Оказалось, что я писал TMemo на трассировке сервера; отключение этого действительно решает проблему, хотя я уже пробовал антивирусный сканер раньше - хорошая рекомендация! Я предполагаю, что OnTrace является многопоточным и автоматически выполняет критический раздел, чтобы сделать его потокобезопасным?   -  person Adrian    schedule 10.09.2012


Ответы (1)


На стороне сервера попробуйте настроить свойство BufferKBSize в компоненте TDSHTTPWebDispatcher. То же свойство можно найти в TsqlConnection компоненте на клиенте.

person Vedran Karuc    schedule 14.09.2012