zstd compression support for CachePackage
This commit is contained in:
parent
eaed69ad1c
commit
fe248d42a1
2 changed files with 23 additions and 9 deletions
25
src/c3nav/mapdata/utils/cache/package.py
vendored
25
src/c3nav/mapdata/utils/cache/package.py
vendored
|
@ -5,6 +5,8 @@ from collections import namedtuple
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
from tarfile import TarFile, TarInfo
|
from tarfile import TarFile, TarInfo
|
||||||
|
|
||||||
|
from pyzstd import CParameter, ZstdFile
|
||||||
|
|
||||||
from c3nav.mapdata.utils.cache import AccessRestrictionAffected, GeometryIndexed, MapHistory
|
from c3nav.mapdata.utils.cache import AccessRestrictionAffected, GeometryIndexed, MapHistory
|
||||||
|
|
||||||
CachePackageLevel = namedtuple('CachePackageLevel', ('history', 'restrictions'))
|
CachePackageLevel = namedtuple('CachePackageLevel', ('history', 'restrictions'))
|
||||||
|
@ -27,15 +29,26 @@ class CachePackage:
|
||||||
filename = settings.CACHE_ROOT / 'package.tar'
|
filename = settings.CACHE_ROOT / 'package.tar'
|
||||||
|
|
||||||
filemode = 'w'
|
filemode = 'w'
|
||||||
if compression is not None:
|
fileobj = None
|
||||||
|
if compression == 'zst':
|
||||||
|
fileobj = ZstdFile(filename, filemode, level_or_option={
|
||||||
|
CParameter.compressionLevel: 9,
|
||||||
|
CParameter.checksumFlag: 1,
|
||||||
|
})
|
||||||
|
elif compression is not None:
|
||||||
filemode += ':' + compression
|
filemode += ':' + compression
|
||||||
|
|
||||||
with TarFile.open(filename, filemode) as f:
|
try:
|
||||||
self._add_bytesio(f, 'bounds', BytesIO(struct.pack('<iiii', *(int(i*100) for i in self.bounds))))
|
with TarFile.open(filename, filemode, fileobj=fileobj) as f:
|
||||||
|
self._add_bytesio(f, 'bounds',
|
||||||
|
BytesIO(struct.pack('<iiii', *(int(i*100) for i in self.bounds))))
|
||||||
|
|
||||||
for level_id, level_data in self.levels.items():
|
for level_id, level_data in self.levels.items():
|
||||||
self._add_geometryindexed(f, 'history_%d' % level_id, level_data.history)
|
self._add_geometryindexed(f, 'history_%d' % level_id, level_data.history)
|
||||||
self._add_geometryindexed(f, 'restrictions_%d' % level_id, level_data.restrictions)
|
self._add_geometryindexed(f, 'restrictions_%d' % level_id, level_data.restrictions)
|
||||||
|
finally:
|
||||||
|
if fileobj is not None:
|
||||||
|
fileobj.close()
|
||||||
|
|
||||||
def _add_bytesio(self, f: TarFile, filename: str, data: BytesIO):
|
def _add_bytesio(self, f: TarFile, filename: str, data: BytesIO):
|
||||||
data.seek(0, os.SEEK_END)
|
data.seek(0, os.SEEK_END)
|
||||||
|
@ -50,7 +63,7 @@ class CachePackage:
|
||||||
self._add_bytesio(f, filename, data)
|
self._add_bytesio(f, filename, data)
|
||||||
|
|
||||||
def save_all(self, filename=None):
|
def save_all(self, filename=None):
|
||||||
for compression in (None, 'gz', 'xz'):
|
for compression in (None, 'gz', 'xz', 'zst'):
|
||||||
self.save(filename, compression)
|
self.save(filename, compression)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
@ -76,8 +89,8 @@ class CachePackage:
|
||||||
def open(cls, filename=None):
|
def open(cls, filename=None):
|
||||||
if filename is None:
|
if filename is None:
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
filename = settings.CACHE_ROOT / 'package.tar'
|
package = settings.CACHE_ROOT / 'package.tar'
|
||||||
return cls.read(open(filename, 'rb'))
|
return cls.read(package.open('rb'))
|
||||||
|
|
||||||
cached = None
|
cached = None
|
||||||
cache_key = None
|
cache_key = None
|
||||||
|
|
|
@ -18,3 +18,4 @@ scipy==1.11.4
|
||||||
django_libsass==0.9
|
django_libsass==0.9
|
||||||
channels==4.0.0
|
channels==4.0.0
|
||||||
daphne==4.0.0
|
daphne==4.0.0
|
||||||
|
pyzstd==0.15.9
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue