#!/usr/bin/env bash # SUM Parts - list an archive's contents without extracting it # # Used to count tiles per split, which is what turns a per-iteration benchmark # into a wall-clock training estimate. set -euo pipefail ARCHIVE="${1:-$HOME/sum-parts/data/_archives/mesh.zip}" source "$HOME/miniconda3/etc/profile.d/conda.sh" conda activate sumparts python - "$ARCHIVE" <<'PY' import re import sys import zipfile from collections import Counter from pathlib import Path path = Path(sys.argv[1]) z = zipfile.ZipFile(path) names = z.namelist() print(f"=== {path.name} : {len(names)} entries ===\n") dirs = Counter() for n in names: p = "/".join(n.split("/")[:-1]) or "." dirs[p] += 1 for d, c in sorted(dirs.items()): print(f" {c:>5} {d}/") print() splits = Counter() for n in names: m = re.search(r"(?:^|/)(train|val|test|training|validation)(?:/|_)", n, re.I) if m: splits[m.group(1).lower()] += 1 if splits: print("split hints:", dict(splits)) ply = [n for n in names if n.lower().endswith(".ply")] print(f"\n.ply entries: {len(ply)}") per_split = Counter(n.split("/")[0] for n in ply) for s, c in sorted(per_split.items()): print(f" {c:>4} ply in {s}/") for n in ply[:5]: print(f" e.g. {n}") total = sum(i.file_size for i in z.infolist()) print(f"\nuncompressed total: {total / 1e9:.2f} GB") PY