2016-06-29 70 views
0

我使用Django爲了從一個大圖像堆棧(每個大約150mb)動態生成圖像來存檔網頁。它假設是交互式的,所以我需要保持緩存選定的堆棧。爲此,我使用了memcached緩存後端和「django.contrib.sessions.backends.cache」會話引擎。使用Django緩存大量數據時發生內存錯誤

問題是,當我使用會話數據呈現頁面時,我不斷收到MemoryError。 這是更有效的方法嗎? 我認爲這是數據大小的問題。無論如何增加內存大小?解決這個問題的另一種方法

在views.py

def images(request): 

    if request.method == 'POST': 

     info_form = InfoForm(request.POST) 

     if (info_form.is_valid()): 

      if selected_stack_changed: 
       matrix = get_matrix(stack_id) 
       request.session['matrix'] = matrix 
      else: 
       matrix = request.session['matrix'] 

    return render(request, url) 

在settings.py

CACHES = { 
    'default': { 
     'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 
     'LOCATION': '127.0.0.1:11211', 
    } 
} 

SESSION_ENGINE = "django.contrib.sessions.backends.cache" 

這裏完整的錯誤我得到:

Internal Server Error: /data/ 
Traceback (most recent call last): 
File "/home/user/.local/lib/python2.7/site-packages/django/core/handlers/base.py", line 235, in get_response 
response = middleware_method(request, response) 
File "/home/user/.local/lib/python2.7/site-packages/django/contrib/sessions/middleware.py", line 50, in process_response 
request.session.save() 
File "/home/user/.local/lib/python2.7/site-packages/django/contrib/sessions/backends/cache.py", line 62, in save 
self.get_expiry_age()) 
File "/home/user/.local/lib/python2.7/site-packages/django/core/cache/backends/memcached.py", line 83, in set 
if not self._cache.set(key, value, self.get_backend_timeout(timeout)): 
File "/home/user/.local/lib/python2.7/site-packages/memcache.py", line 740, in set 
return self._set("set", key, val, time, min_compress_len, noreply) 
File "/home/user/.local/lib/python2.7/site-packages/memcache.py", line 1060, in _set 
return _unsafe_set() 
File "/home/user/.local/lib/python2.7/site-packages/memcache.py", line 1034, in _unsafe_set 
store_info = self._val_to_store_info(val, min_compress_len) 
File "/home/user/.local/lib/python2.7/site-packages/memcache.py", line 998, in _val_to_store_info 
pickler.dump(val) 
MemoryError 
+1

有人可能能夠幫助你,如果你真的顯示你如何使用memcached!但請注意,它不是用來容納非常大的物體。儘管可以增加默認的最大對象大小1MB。 – e4c5

回答

0

理想的分佈式緩存服務器不應該在與您的Web服務器相同的主機。標準的memcached安裝將有多個memcached實例獨立運行在靠近Web服務器的各個服務器上,並且Web服務器通過網絡與它們通信。更詳細的安裝將會有多個memcached實例管理,該代理將請求路由到memcached服務器主機。一個受歡迎的代理是Mcrouter