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