如何使用Delphi 2010优化上传例程?

时间:2012-02-28 05:13:12

标签: performance delphi upload indy resume-upload

我的尚未发布 Delphi 2010应用程序允许用户将文件上传到我的服务器。现在我正在使用HTTPS POST发送文件,(简化)算法基本上是:

  1. 将文件拆分为“切片”(每个256KB)
  2. 对于每个切片,将其POST到服务器
  3. 即。对于1MB文件:

    --> Get Slice #1 (256KB)
    --> Upload Slice #1 using TidHTTP.Post()
    
    --> Get Slice #2 (256KB)
    --> Upload Slice #2 using TidHTTP.Post()
    
    --> Get Slice #3 (256KB)
    --> Upload Slice #3 using TidHTTP.Post()
    
    --> Get Slice #4 (256KB)
    --> Upload Slice #4 using TidHTTP.Post()
    

    我正在使用 Indy 10 。我(ab)一遍又一遍地使用我的探查器,除了更改上传例程本身之外,没有太多优化。

    我也在使用多线程,即使我尽力优化我的代码,我的基准测试仍然告诉我我可以做得更好(还有其他优化的软件可以实现一个很多更好的时间......几乎是我上传程序的两倍!)

    我知道这不是我服务器的错!这是我仍需要探索的想法:

    1. 我尝试在单个POST中对切片进行分组,这自然导致性能提升(20-35%),但现在恢复了恢复能力。

    2. 我还考虑过使用SFTP / SSH,但我不确定它是否快速。

    3. 使用网络套接字实现可恢复上传(如this component),我也不确定速度。

    4. 现在我的问题是:我能做些什么来加快上传速度?我愿意接受我可以实施的任何建议,包括命令行工具(如果许可证允许我将其与我的应用程序一起发货),前提是:

      1. 支持可恢复上传
      2. 快!
      3. 合理的内存使用
      4. 安全&允许登录/用户身份验证
      5. 此外,由于主要的安全问题,FTP不是我想要实现的东西。

        非常感谢!

1 个答案:

答案 0 :(得分:5)

我建议为整个文件执行一个TIdHTTP.Post()而不对其进行整理。您可以使用TIdHTTP.OnWork...事件来跟踪发送到服务器的字节数,以便您知道在需要时从何处继续。恢复时,您可以使用TIdHTTP.Request.CustomHeaders属性来包含一个自定义标头,告诉服务器您要从哪里恢复,因此它可以在接受新数据之前将其先前的文件回滚到指定的偏移量。