【问题标题】:How can I speed up a web-application? (Avoid rebuilding a structure.)如何加快 Web 应用程序的速度? (避免重建结构。)
【发布时间】:2009-06-07 14:34:19
【问题描述】:

在成功构建静态数据结构 (see here) 后,我希望避免每次用户请求对其进行操作时都必须从头开始构建它。我天真的第一个想法是将结构(使用python的pickle)转储到一个文件中,并为每个查询加载这个文件。不用说(正如我想的那样),这太费时了,因为文件相当大。

有什么想法可以轻松加快这件事的速度吗?将文件拆分为多个文件?还是在服务器上运行的程序? (这实现起来有多难?)

感谢您的帮助!

【问题讨论】:

  • 您使用什么框架?姜戈?
  • 没有网络框架。只有 Apache 服务器。

标签: python apache web-applications pickle


【解决方案1】:

您可以将其转储到内存缓存中(例如memcached)。

此方法具有缓存键失效的优点。当底层数据发生变化时,您可以使缓存数据失效。

编辑

这是 memcached 的 python 实现:python-memcached。谢谢NicDumZ

【讨论】:

  • memcached 客户端有一个 Python 实现:tummy.com/Community/software/python-memcached 简而言之,一个守护进程将在您的服务器上运行,为您的进程提供对象。请注意,python-memcached 依赖于酸洗,因此如果单独使用 memcached 没有足够的帮助,您可能想尝试 alex 的建议。
  • 感谢有关 memcached 的提示。我也会标记你的答案,如果一个人可以标记两个解决方案......
【解决方案2】:

如果您可以使用Unladen Swallow 项目中提供的补丁重建您的 Python 运行时,您应该会看到酸洗速度提高 40% 到 150%,反酸洗速度提高 36% 到 56%,根据their benchmarks;也许这可能会有所帮助。

【讨论】:

    【解决方案3】:

    我的建议是不要依赖对象结构。取而代之的是一个字节数组(或 mmap 文件等),您可以对其进行随机访问操作并使用该结构内的指针实现交叉引用。

    的确,它会引入指向代码的指针的概念,但这意味着您不需要在每次处理程序进程启动时都取消它,而且它也将使用更少的内存(因为赢了'不是python对象的开销)。

    由于您的数据库将在处理程序进程的生命周期内得到修复(我想),您无需担心并发修改或锁定等问题。

    即使您按照您的建议进行操作,也不必在每个用户请求时都重新构建它,只需在工作进程的内存中保留一个实例,这意味着构建为只有在新的工作进程启动时才构建它。

    【讨论】:

    • 只是为了检查我是否理解正确:如果我有一个树结构,并且想使用 mmap 访问它,我创建一个文件如下:让每一行代表一个节点。然后根在第一行,连同它的值(或指向它的指针)和它的孩子的行号列表。 (和孩子们的定义类似。)这是这个想法吗?
    • 好的,我实现了它... über-fast!伟大的!感谢您提供有关指针的提示。
    【解决方案4】:

    加速您的 Web 应用程序的首要方法,尤其是当您有许多需要初始化的大部分是静态的模块、类和对象时:使用支持从单个解释器处理多个请求的文件服务方式,例如 mod_wsgi、mod_python、SCGI、FastCGI、Google App Engine、Python Web 服务器......基本上任何东西除了一个标准 CGI 脚本,它为每个请求启动一个新的 Python 进程。使用这种方法,您可以使您的数据结构成为一个全局对象,只需为每个新的进程从序列化格式中读取该对象,这种方式的频率要低得多。

    【讨论】:

    • +1:mod_wsgi 守护进程意味着您可以将结构保存在内存中,而无需费力进行酸洗和从酸洗中恢复它的细节。用 mod_wsgi 守护进程替换 CGI 是立竿见影的。
    猜你喜欢
    • 2011-06-05
    • 2011-01-15
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多