142 lines
3.5 KiB
Python
142 lines
3.5 KiB
Python
import subprocess
|
|
import time
|
|
from pathlib import Path
|
|
import zipfile
|
|
import zstandard as zstd
|
|
|
|
# ============================================================
|
|
# CONFIG
|
|
# ============================================================
|
|
|
|
SRC = Path(r"D:\medicusbackup\MEDICUS_2026-01-24_17-07-44.fbk")
|
|
BASE = SRC.with_suffix("")
|
|
CHUNK = 8 * 1024 * 1024 # 8 MB
|
|
|
|
SEVENZIP_EXE = r"c:\Program Files (x86)\7-Zip\7z.exe"
|
|
|
|
ORIG_SIZE = SRC.stat().st_size
|
|
|
|
|
|
# ============================================================
|
|
# ZIP (ZIP64 + progress)
|
|
# ============================================================
|
|
|
|
def zip_test():
|
|
dst = BASE.with_suffix(".zip")
|
|
total = ORIG_SIZE
|
|
processed = 0
|
|
|
|
start = time.time()
|
|
|
|
with zipfile.ZipFile(
|
|
dst,
|
|
"w",
|
|
compression=zipfile.ZIP_DEFLATED,
|
|
compresslevel=9,
|
|
) as zf:
|
|
|
|
zi = zipfile.ZipInfo(SRC.name)
|
|
zi.compress_type = zipfile.ZIP_DEFLATED
|
|
|
|
# ⬇⬇⬇ KLÍČOVÁ OPRAVA ⬇⬇⬇
|
|
with zf.open(zi, "w", force_zip64=True) as z:
|
|
with open(SRC, "rb") as f:
|
|
while buf := f.read(CHUNK):
|
|
z.write(buf)
|
|
processed += len(buf)
|
|
print(
|
|
f"\rZIP {processed*100/total:6.2f}%",
|
|
end="",
|
|
flush=True,
|
|
)
|
|
|
|
print()
|
|
return time.time() - start, dst.stat().st_size
|
|
|
|
|
|
# ============================================================
|
|
# 7Z (CLI + progress)
|
|
# ============================================================
|
|
|
|
def sevenzip_test():
|
|
dst = BASE.with_suffix(".7z")
|
|
|
|
start = time.time()
|
|
|
|
proc = subprocess.Popen(
|
|
[SEVENZIP_EXE, "a", "-t7z", "-mx=9", str(dst), str(SRC)],
|
|
stdout=subprocess.PIPE,
|
|
stderr=subprocess.STDOUT,
|
|
text=True,
|
|
)
|
|
|
|
for line in proc.stdout:
|
|
if "%" in line:
|
|
print(f"\r7Z {line.strip():>6}", end="", flush=True)
|
|
|
|
proc.wait()
|
|
print()
|
|
|
|
return time.time() - start, dst.stat().st_size
|
|
|
|
|
|
# ============================================================
|
|
# ZSTD (stream + progress)
|
|
# ============================================================
|
|
|
|
def zstd_test():
|
|
dst = BASE.with_suffix(".zst")
|
|
total = ORIG_SIZE
|
|
processed = 0
|
|
|
|
cctx = zstd.ZstdCompressor(level=19)
|
|
start = time.time()
|
|
|
|
with open(SRC, "rb") as src, open(dst, "wb") as out:
|
|
with cctx.stream_writer(out) as compressor:
|
|
while buf := src.read(CHUNK):
|
|
compressor.write(buf)
|
|
processed += len(buf)
|
|
print(
|
|
f"\rZSTD {processed*100/total:6.2f}%",
|
|
end="",
|
|
flush=True,
|
|
)
|
|
|
|
print()
|
|
return time.time() - start, dst.stat().st_size
|
|
|
|
|
|
# ============================================================
|
|
# MAIN
|
|
# ============================================================
|
|
|
|
results = {}
|
|
|
|
print("\n--- ZIP ---")
|
|
t, s = zip_test()
|
|
results["ZIP"] = (t, s)
|
|
|
|
# print("\n--- 7Z ---")
|
|
# t, s = sevenzip_test()
|
|
# results["7Z"] = (t, s)
|
|
#
|
|
# print("\n--- ZSTD ---")
|
|
# t, s = zstd_test()
|
|
# results["ZSTD"] = (t, s)
|
|
|
|
|
|
# ============================================================
|
|
# SUMMARY
|
|
# ============================================================
|
|
|
|
print("\n=== SUMMARY ===")
|
|
for name, (t, size) in results.items():
|
|
ratio = 100 * (1 - size / ORIG_SIZE)
|
|
print(
|
|
f"{name:5s}: "
|
|
f"{t:7.1f} s "
|
|
f"{size/1024/1024:8.1f} MB "
|
|
f"(-{ratio:5.1f} %)"
|
|
)
|