Delphi(DataSnap)速度慢

3
我最近开始使用Delphi中的DataSnap来生成RESTful web服务。在遵循了Marco Cantu本人和互联网上其他几位指南的指导后,我已经成功地让整个“链条”运作起来。
但是有一个小问题需要解决:客户端现在可以将流(以及其大小)发送到服务器(由于这里存在错误DataSnap XE2 and TStream method parameters,读取时会一直读到发送的大小),然后服务器将其重新组合成文件并保存到磁盘上。
但对于一个3.66MiB的文件,这需要超过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;

任何帮助都将不胜感激!

谢谢,Adrian


这应该是这样吗?” 不是,但可能是网络问题。如果您只是将该大小的文件复制到服务器上会发生什么?如果您ping/tracert服务器,会看到什么? - GolezTrol
抱歉,它们都在同一台计算机上;也就是说,连接到本地主机。 - Adrian
2
听起来像是一个实现错误:等待超时时间到达,然后截断返回的内容。它应该处理Content-Length HTTP头。 - Arnaud Bouchez
1
不是答案,但可以说它是可行的:我们的mORMot RESTFul 框架可以处理自定义流内容,只需通过interface定义的服务即可(无需通过所有DataSnap管道和向导,并且具有非常好的速度) - 它甚至可以使用http.sys内核模式服务器来处理文件,而在用户空间内存中不需要进行内存拷贝。 - Arnaud Bouchez
2
由于您正在编写一个 .exe 文件,是否可能在文件编写时病毒扫描器正在积极扫描该文件?我认为 TFileStream 会自动缓冲每个 4Kb 的读写操作,这可能会导致文件在编写时被多次重新扫描。 - GolezTrol
2
原来我是在服务器跟踪中写入了一个TMemo;禁用它确实解决了问题,尽管我之前尝试过病毒扫描器 - 好建议!我猜OnTrace是线程化的,并自动执行关键部分以使其线程安全? - Adrian
1个回答

1
在服务器端,尝试调整 TDSHTTPWebDispatcher 组件上的 BufferKBSize 属性。同样的属性也可以在客户端的 TsqlConnection 组件中找到。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接