我正在为python程序员使用后缀树包装器。 https://hkn.eecs.berkeley.edu/~dyoo/python/suffix_trees/
我每次都需要后缀树的相同实例,在Django中调用一个视图。因此,我将后缀树实例存储在django缓存中,并在每次需要该实例时检索它。在
问题1:当我从缓存中检索它时,它总是更改内存位置。即使python使用引用存储数据。在
问题2:在两次检索之后,python浮动一个“分段错误(核心转储)”
问题1:为什么后缀树的实例从缓存更改其内存位置?在
问题2:为什么显示分段错误?在
问题3:他们是否有其他方法在django的某处存储后缀树的持久实例,并使用相同的实例?在
$ python manage.py shell
Python 2.7.5 (default, Mar 22 2016, 00:57:36)
[GCC 4.7.2 20121109 (Red Hat 4.7.2-8)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> import SuffixTree
>>> d=SuffixTree.SubstringDict()
>>> d["3132"]=1
>>> d["3"]
[1]
>>> d["4343"]=2
>>> d["3"]
[1, 2]
>>> from django.core.cache import cache
>>> cache.set("c",d,1000)
>>> d
<SuffixTree.SubstringDict.SubstringDict instance at 0x27bd830>
>>> cache.get("c")
<SuffixTree.SubstringDict.SubstringDict instance at 0x27ca908>
>>> cache.get("c")
<SuffixTree.SubstringDict.SubstringDict instance at 0x27ca9e0>
>>> cache.get("c")
Segmentation fault (core dumped)
问题的关键是Django不在进程内存中存储缓存,所以您放入缓存中的所有对象在存储之前都被序列化,当您取回这些对象时,这些对象将被反序列化。每次检索它们时,都会创建一个新对象,它是存储对象的副本。在
它是这样实现的,因为在生产环境中,您将有多个django工作进程(可能在不同的服务器上运行)。所有的工作进程都需要共享同一个缓存。因为每个请求都可以处理不同的请求,所以不能对同一个请求进行处理。在
此问题的解决方法因应用程序的用途而异。在
根据您的注释,您可以创建一个将在请求之间缓存实例的模块:
然后在视图中调用
get_cached_tree()
来获取后缀树。在不同的worker上仍然会有不同的实例,但是它的工作速度会更快,并且没有segfaultsp.S.分段错误是由于您使用的Python解释器中的错误造成的,或者更可能是您所使用的包的错误。您应该确保您使用了包的最新版本(https://github.com/JDonner/SuffixTree),如果它没有帮助,您应该分析stacktrace(核心转储)并向SuffixTree repo提交一个bug。在
相关问题 更多 >
编程相关推荐