perf: batch export graph database queries

This commit is contained in:
2026-08-05 12:55:37 +02:00
parent 80ef1be239
commit f5ad77b430
10 changed files with 331 additions and 128 deletions
+26 -2
View File
@@ -8,6 +8,7 @@ import posixpath
import zipfile
from collections.abc import Iterable
from dataclasses import dataclass
from pathlib import PurePosixPath
from typing import BinaryIO
from django.core.serializers.json import DjangoJSONEncoder
@@ -18,6 +19,19 @@ FORMAT_NAME = "netbox-export"
FORMAT_VERSION = 1
MANIFEST_NAME = "manifest.json"
OBJECTS_NAME = "objects.ndjson"
PRECOMPRESSED_SUFFIXES = {
".7z",
".avi",
".gz",
".jpeg",
".jpg",
".mp3",
".mp4",
".pdf",
".png",
".webp",
".zip",
}
def _json_bytes(value) -> bytes:
@@ -59,11 +73,21 @@ def build_archive(manifest: dict, records: Iterable[dict], assets: dict[str, byt
manifest["signature"] = _signature(manifest, signing_key)
output = io.BytesIO()
with zipfile.ZipFile(output, "w", compression=zipfile.ZIP_DEFLATED, compresslevel=6) as archive:
with zipfile.ZipFile(output, "w", compression=zipfile.ZIP_DEFLATED, compresslevel=1) as archive:
archive.writestr(MANIFEST_NAME, _json_bytes(manifest))
archive.writestr(OBJECTS_NAME, object_data)
for path, content in sorted(assets.items()):
archive.writestr(_safe_member_name(path), content)
compression = (
zipfile.ZIP_STORED
if PurePosixPath(path).suffix.lower() in PRECOMPRESSED_SUFFIXES
else zipfile.ZIP_DEFLATED
)
archive.writestr(
_safe_member_name(path),
content,
compress_type=compression,
compresslevel=None if compression == zipfile.ZIP_STORED else 1,
)
return output.getvalue()