【问题标题】:Delphi Indy HTTPServer: Write text in Chunks possible?Delphi Indy HTTPServer:可以用块编写文本吗?
【发布时间】:2022-01-15 18:03:06
【问题描述】:

是否可以通过 Indy HTTP 服务器以块的形式向请求客户端发送大量文本(csv 数据库导出)以避免遇到内存限制?

我正在用 Delphi 10.4.2 编写的应用程序服务器中实现一个 REST 接口,因为由于一些不可协商的原因,我无法公开数据库连接。

数据将由使用 R 的统计学家使用。

由于数据量可以增长到 1 GB,我不喜欢填充字符串并将其写入连接。

【问题讨论】:

  • 如果响应数据被定向到客户端的文件流,1 GB的数据大小不会影响客户端的RAM使用。 Indy HTTP 客户端支持这种基于文件流的响应处理。
  • 谢谢。上面链接后面的 Remys 代码应该可以完成这项工作。我会将查询结果写入文件并分块发送。我希望 R 可以处理...
  • @mjn 需要chunked 传输编码是正确的,但是您提供的链接与该编码无关。也许您的意思是this answer
  • @MichaSchumann 链接到的答案是使用Range 请求标头处理HTTP 请求。这与您的要求无关。如果你想分块发送大量数据,使用TIdHTTPRangeStream 是错误的方法。您正在寻找的是 HTTP 1.1 及更高版本中的 'chunked' transfer encoding,如 this answer 中所示。
  • 感谢您提供的信息。

标签: csv http delphi indy indy10


【解决方案1】:

@MichaSchumann, 现代互联网浏览器经常使用来自 Apache2.4 WebServer 的“gzip”数据(对于 Windows 10 版本 - 请参阅 XAMPP)。浏览器通常解包数据,并根据文件显示内容,以及神奇的内容/类型(可以是文本(html)或二进制(图片)。

Indy 9 正在一对一地发送数据包。这意味着,数据是“不”安全的,并且在发送之前“不”打包。 所以,你可以“gzip”你的 CSV 文件(csv 文件通常由 ASCII-Text 组成,它可以快速打包成一个大小更小的二进制文件,并且数据流的传输在阶段(如果您考虑时间,1 GiByte 的文件需要多少时间!

注意:您应该为每个块发送一个标头。 在这个header中,你保存了实际传输的chunk的大小和位置的相关信息。

所以,您可以实现自己的 FTP 服务器,记住他的“位置”状态。 这在连接中断时很有用。 普通(旧的 FTP 服务器)的缺点是它们需要每个断开连接的第一个块的第一个位置。这意味着:您始终从 0 .. 大小发送文件。

请随时提出其他问题,我很开放,欢迎您。

【讨论】:

  • 谢谢。由于时间限制,我目前在传输和传输此 zip 文件之前压缩 csv 文件。我发现 ZIP 文件有大约 700 MB 的限制,其中包含大约几 GB 的 CSV 数据,应该适合。
猜你喜欢
  • 2014-12-23
  • 1970-01-01
  • 2011-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-02
  • 2015-12-02
相关资源
最近更新 更多