save level render data into a file instead of pickling it into the db
This commit is contained in:
parent
7f0d52f23f
commit
d9e443c9cc
4 changed files with 34 additions and 10 deletions
|
@ -1,4 +1,5 @@
|
|||
import operator
|
||||
import os
|
||||
import pickle
|
||||
import threading
|
||||
from collections import Counter, deque
|
||||
|
@ -6,6 +7,7 @@ from functools import reduce
|
|||
from itertools import chain
|
||||
|
||||
import numpy as np
|
||||
from django.conf import settings
|
||||
from django.db import transaction
|
||||
from scipy.interpolate import NearestNDInterpolator
|
||||
from shapely import prepared
|
||||
|
@ -313,7 +315,7 @@ class LevelRenderData:
|
|||
for access_restriction, areas in render_data.access_restriction_affected.items()
|
||||
}
|
||||
|
||||
level.render_data = pickle.dumps(render_data)
|
||||
render_data.save(level.pk)
|
||||
|
||||
map_history.save(MapHistory.level_filename(level.pk, 'composite'))
|
||||
|
||||
|
@ -325,6 +327,10 @@ class LevelRenderData:
|
|||
cache_key = None
|
||||
cache_lock = threading.Lock()
|
||||
|
||||
@staticmethod
|
||||
def _level_filename(pk):
|
||||
return os.path.join(settings.CACHE_ROOT, 'level_%d_render_data.pickle' % pk)
|
||||
|
||||
@classmethod
|
||||
def get(cls, level):
|
||||
with cls.cache_lock:
|
||||
|
@ -338,14 +344,15 @@ class LevelRenderData:
|
|||
if result is not None:
|
||||
return result
|
||||
|
||||
if isinstance(level, Level):
|
||||
result = pickle.loads(level.render_data)
|
||||
else:
|
||||
result = pickle.loads(Level.objects.filter(pk=level).values_list('render_data', flat=True)[0])
|
||||
pk = level.pk if isinstance(level, Level) else level
|
||||
result = pickle.load(open(cls._level_filename(pk), 'rb'))
|
||||
|
||||
cls.cached[level_pk] = result
|
||||
return result
|
||||
|
||||
def save(self, pk):
|
||||
return pickle.dump(self, open(self._level_filename(pk), 'wb'))
|
||||
|
||||
|
||||
class Mesh:
|
||||
__slots__ = ('top', 'sides', 'bottom')
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue