#!/usr/bin/env python3 import subprocess import time import os import sys from pathlib import Path def get_file_size(filepath): """Получить размер файла в байтах""" return os.path.getsize(filepath) def format_size(size_bytes): """Конвертировать байты в человеко-читаемый формат""" for unit in ['B', 'KB', 'MB', 'GB']: if size_bytes < 1024.0: return f"{size_bytes:.1f} {unit}" size_bytes /= 1024.0 return f"{size_bytes:.1f} TB" def run_compression(input_file, level): """Запустить сжатие с заданной степенью и вернуть время и размер""" output_file = f"{input_file}.zstd-{level}" start_time = time.time() try: # Запускаем zstd с указанной степенью сжатия subprocess.run( ['zstd', f'-{level}', input_file, '-o', output_file ], check=True, capture_output=True, text=True ) except subprocess.CalledProcessError as e: print(f"Ошибка при сжатии с уровнем {level}: {e.stderr}") return None, None end_time = time.time() elapsed_time = end_time - start_time archive_size = get_file_size(output_file) # Опционально: удалить архив после измерения # os.remove(output_file) return elapsed_time, archive_size def main(): input_file = "47news.mysql" # Проверяем существование файла if not Path(input_file).exists(): print(f"Ошибка: файл {input_file} не найден!") sys.exit(1) # Получаем исходный размер original_size = get_file_size(input_file) # Заголовок таблицы print(f"\n{'Степень':<8} {'Время (сек)':<12} {'Размер':<12} {'Коэфф. сжатия':<15} {'Эффективность':<15}") print("-" * 70) results = [] # Прогоняем для степеней сжатия 1-19 for level in range(1, 20): elapsed_time, archive_size = run_compression(input_file, level) if elapsed_time is None: continue compression_ratio = original_size / archive_size efficiency = compression_ratio / elapsed_time results.append({ 'level': level, 'time': elapsed_time, 'size': archive_size, 'ratio': compression_ratio, 'efficiency': efficiency }) # Выводим строку таблицы print(f"{level:<8} {elapsed_time:<12.2f} {format_size(archive_size):<12} {compression_ratio:<15.2f} {efficiency:<15.2f}") # Выводим итоговую информацию print("\n" + "="*70) print(f"Исходный файл: {input_file}") print(f"Исходный размер: {format_size(original_size)} ({original_size:,} байт)") print("="*70) # Находим лучший результат по эффективности if results: best_efficiency = max(results, key=lambda x: x['efficiency']) print(f"\nЛучшая эффективность (коэфф.сжатия/время):") print(f" Степень сжатия: {best_efficiency['level']}") print(f" Время: {best_efficiency['time']:.2f} сек") print(f" Размер: {format_size(best_efficiency['size'])}") print(f" Коэффициент сжатия: {best_efficiency['ratio']:.2f}") print(f" Эффективность: {best_efficiency['efficiency']:.2f}") if __name__ == "__main__": main()