如何将数据存储在Django缓存中作为引用而不是值。?

2024-09-30 00:29:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为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)

Tags: django实例instance内存coreimportcacheget
1条回答
网友
1楼 · 发布于 2024-09-30 00:29:30

问题的关键是Django不在进程内存中存储缓存,所以您放入缓存中的所有对象在存储之前都被序列化,当您取回这些对象时,这些对象将被反序列化。每次检索它们时,都会创建一个新对象,它是存储对象的副本。在

它是这样实现的,因为在生产环境中,您将有多个django工作进程(可能在不同的服务器上运行)。所有的工作进程都需要共享同一个缓存。因为每个请求都可以处理不同的请求,所以不能对同一个请求进行处理。在

此问题的解决方法因应用程序的用途而异。在

根据您的注释,您可以创建一个将在请求之间缓存实例的模块:

from datetime import timedelta, datetime

MAX_LIVE_TIME = timedelta(seconds=3600)

_tree_instance = None
_tree_timestamp = None

def get_cached_tree():
    global _tree_instance, _tree_timestamp
    if _tree_instance is not None and _tree_timestamp - datetime.now() < MAX_LIVE_TIME:
        return _tree_instance

    _tree_instance = 'SuffixTree' # Replace this with SuffixTree creation
    _tree_timestamp = now()
    return _tree_instance

然后在视图中调用get_cached_tree()来获取后缀树。在不同的worker上仍然会有不同的实例,但是它的工作速度会更快,并且没有segfaults

p.S.分段错误是由于您使用的Python解释器中的错误造成的,或者更可能是您所使用的包的错误。您应该确保您使用了包的最新版本(https://github.com/JDonner/SuffixTree),如果它没有帮助,您应该分析stacktrace(核心转储)并向SuffixTree repo提交一个bug。在

相关问题 更多 >

    热门问题