在成功构建静态数据结构(see here)之后,我希望避免每次用户请求对其进行操作时都必须从头开始构建它。我的天真的第一个想法是将结构(使用python的pickle)转储到一个文件中,并为每个查询加载此文件。毋庸置疑(正如我所知),由于文件相当大,这太费时了。
我有什么想法可以轻松加快这件事吗?将文件拆分成多个文件?还是在服务器上运行的程序? (这有多难实现?)
感谢您的帮助!
答案 0 :(得分:4)
您可以将其转储到内存缓存中(例如memcached)。
此方法具有缓存密钥失效的优点。当基础数据发生变化时,您可以使缓存数据无效。
这是memcached:python-memcached的python实现。谢谢NicDumZ。
答案 1 :(得分:3)
如果您可以使用Unladen Swallow项目中提供的补丁重建Python运行时,根据{{3},您应该会看到酸洗的加速比例为40%至150%,非爆破加速率为36%至56% };也许这可能有所帮助。
答案 2 :(得分:2)
我的建议是不要依赖于对象结构。而是有一个字节数组(或mmap'd文件等),您可以对其进行随机访问操作,并使用该结构内的指针实现交叉引用。
是的,它会引入指向代码的指针的概念,但这意味着每次处理程序进程启动时你都不需要取消它,并且它也会使用更少的内存(因为它赢了)不是python对象的开销。
由于您的数据库将在处理程序进程的生命周期中得到修复(我想),您不必担心并发修改或锁定等。
即使您按照建议执行操作,也不必在每个用户请求上重建它,只需在工作进程中将实例保留在内存中,这意味着构建时不需要太长时间。您只在新工作进程启动时构建它。
答案 3 :(得分:2)
加速Web应用程序的第一种方法,特别是当您有许多需要初始化的大多数静态模块,类和对象时:使用一种方式来提供支持从单个解释器提供多个请求的文件,例如mod_wsgi,mod_python,SCGI,FastCGI,Google App Engine,Python Web服务器......基本上任何除了标准CGI脚本,它为每个请求启动一个新的Python进程。使用这种方法,您可以使您的数据结构成为一个全局对象,只需要从每个新进程的序列化格式中读取 - 这种情况要少得多。