【问题标题】:Python cgi FieldStorage slow, alternatives?Python cgi FieldStorage 慢,有什么替代方法?
【发布时间】:2009-05-22 10:15:13
【问题描述】:

我有一个 python cgi 脚本,它接收通过 http 帖子上传的文件。文件可能很大(300+ Mb)。问题是,cgi.FieldStorage() 获取文件的速度非常慢(一个 300Mb 的文件需要 6 分钟才能“接收”)。通过读取标准输入来做同样的事情大约需要 15 秒。后者的问题是,如果发布了多个字段,我将不得不自己解析数据。

FieldStorage() 有更快的替代方法吗?

【问题讨论】:

标签: python cgi


【解决方案1】:

“[I] 必须自己解析数据”

为什么? CGI 有一个 parser 你可以显式调用。

读取上传的流并将其保存在本地磁盘文件中。

为了获得极快的速度,请使用 StringIO 内存文件。请注意上传将占用的内存量。

使用cgi.parse(mylocalfile)

【讨论】:

  • cgi 文档谈到 parse.parse_multipart 时说:“这很容易使用,但如果您希望上传兆字节,则效果不佳——在这种情况下,请使用更灵活的 FieldStorage 类。 "
  • 通常,灵活性是有代价的。而代价通常是速度。
  • 我不认为将上传文件放入内存文件是一个好主意。在服务器上,这可能会快速杀死服务器。当同时进行多个 300MB 上传时,您的 1GB 上传速度非常快。我还假设,问题出在解析器上。大多数时候,网络上的输入只有几百字节或更少。在那里,您没有优化解析器以获得快速访问速度。最好是一个解析器,它经过优化可以让输入流抛出。
  • @Juergen:“读取上传的流并将其保存在本地磁盘文件中”应该避免大上传造成的内存消耗。您可以轻松限制缓冲区大小。
  • @Ash 我尝试了两种解决方案,cgi.parse_multipartcgi.FieldStorage,虽然 parse_multipart 更糟!您还有其他解决方案吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-17
  • 2021-08-20
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多