Utoljára aktív 1 day ago

0.md Eredeti
  • * X * - отмечен дефолтный уровень сжатия для zstd (3). Даже при этом объеме скорость сжатия значительно выше используемого gzip

  • >> X << - отмечен уровень сжатия, при котором время работы близко к используемому gzip. При этом степень сжатия заметно выше.

  • Parallel ZSTD использует, по умолчанию, все ядра процессора. Скорость примерно в 3 раза выше ценой незначительного ухудшения сжатия.

# 47news

## GZIP 
real    1m32.593s
user    1m29.764s
254 886 Kb = 249 MB

## ZSTD

Степень  Время (сек)  Размер       Коэфф. сжатия   Эффективность
----------------------------------------------------------------------
1        6.64         261.4 MB     4.12            0.62
2        7.41         258.1 MB     4.18            0.56
3      * 9.30 *       232.4 MB     4.64            0.50
4        9.12         230.1 MB     4.68            0.51
5        18.40        220.6 MB     4.89            0.27
6        24.43        208.7 MB     5.16            0.21
7        29.47        199.0 MB     5.42            0.18
8        37.00        192.5 MB     5.60            0.15
9     >> 40.69 <<     189.9 MB     5.68            0.14
10       56.94        181.7 MB     5.93            0.10
11       86.44        175.2 MB     6.15            0.07
12       96.17        174.8 MB     6.16            0.06

## Parallel ZSTD 

Степень  Время (сек)  Размер       Коэфф. сжатия   Эффективность
----------------------------------------------------------------------
1        2.17         262.5 MB     4.11            1.89
2        2.69         258.8 MB     4.16            1.55
3      * 3.45 *       234.5 MB     4.59            1.33
4        3.75         232.5 MB     4.64            1.24
5        5.90         221.3 MB     4.87            0.83
6        7.14         209.5 MB     5.14            0.72
7        8.97         200.0 MB     5.39            0.60
8        10.92        193.9 MB     5.56            0.51
9     >> 11.94 <<     190.8 MB     5.65            0.47
10       18.02        182.8 MB     5.89            0.33
11       29.80        176.6 MB     6.10            0.20
12       31.89        176.2 MB     6.12            0.19

# 47news_archive

## GZIP 

0:02:17
4716М -> 309M

## ZSTD

Степень  Время (сек)  Размер       Коэфф. сжатия   Эффективность
----------------------------------------------------------------------
1        6.67         206.0 MB     22.89           3.43
2        7.03         189.9 MB     24.84           3.53
3      * 8.44 *       167.8 MB     28.11           3.33
4        9.36         167.3 MB     28.20           3.01
5        17.37        157.5 MB     29.94           1.72
6        22.03        150.1 MB     31.42           1.43
7        25.69        146.2 MB     32.26           1.26
8        31.99        141.9 MB     33.24           1.04
9     >> 36.09 <<     137.4 MB     34.33           0.95
10       49.73        133.9 MB     35.22           0.71
11       67.98        131.3 MB     35.93           0.53
12       76.52        131.2 MB     35.96           0.47
13       428.43       135.2 MB     34.88           0.08

## Parallel ZSTD

Степень  Время (сек)  Размер       Коэфф. сжатия   Эффективность
----------------------------------------------------------------------
1        3.14         215.5 MB     21.88           6.98
2        3.59         195.7 MB     24.10           6.72
3      * 3.32 *       172.7 MB     27.31           8.23
4        3.76         172.2 MB     27.39           7.29
5        5.44         161.1 MB     29.27           5.38
6        6.31         153.7 MB     30.69           4.86
7        7.43         149.8 MB     31.48           4.24
8        8.98         146.4 MB     32.22           3.59
9     >> 9.84 <<      140.1 MB     33.66           3.42
10       13.60        136.7 MB     34.49           2.54
11       20.79        134.2 MB     35.14           1.69
12       21.87        134.1 MB     35.17           1.61


# 47news_stats

## GZIP

1136М -> 128M
0:00:38

## ZSTD

Степень  Время (сек)  Размер       Коэфф. сжатия   Эффективность
----------------------------------------------------------------------
1        4.26         129.1 MB     8.80            2.07
2        4.67         128.8 MB     8.82            1.89
3      * 5.72 *       133.7 MB     8.50            1.49
4        5.95         133.7 MB     8.50            1.43
5        14.12        128.3 MB     8.86            0.63
6        19.43        117.5 MB     9.67            0.50
7        23.54        117.3 MB     9.69            0.41
8        28.87        110.4 MB     10.29           0.36
9     >> 31.04 <<     110.7 MB     10.26           0.33
10       42.70        110.1 MB     10.32           0.24
11       63.48        109.7 MB     10.35           0.16

## Parallel ZSTD

Степень  Время (сек)  Размер       Коэфф. сжатия   Эффективность
----------------------------------------------------------------------
1        1.38         129.2 MB     8.79            6.38
2        1.49         128.8 MB     8.82            5.91
3      * 1.87 *       134.4 MB     8.46            4.52
4        2.05         134.3 MB     8.46            4.13
5        4.34         128.2 MB     8.87            2.04
6        4.93         117.4 MB     9.68            1.96
7        6.45         117.2 MB     9.69            1.50
8        7.47         110.4 MB     10.30           1.38
9     >> 8.76 <<      110.7 MB     10.27           1.17
10       12.41        110.1 MB     10.32           0.83
11       19.22        109.7 MB     10.36           0.54
12       20.63        109.7 MB     10.36           0.50

1.py Eredeti
1#!/usr/bin/env python3
2
3import subprocess
4import time
5import os
6import sys
7from pathlib import Path
8
9def get_file_size(filepath):
10 """Получить размер файла в байтах"""
11 return os.path.getsize(filepath)
12
13def format_size(size_bytes):
14 """Конвертировать байты в человеко-читаемый формат"""
15 for unit in ['B', 'KB', 'MB', 'GB']:
16 if size_bytes < 1024.0:
17 return f"{size_bytes:.1f} {unit}"
18 size_bytes /= 1024.0
19 return f"{size_bytes:.1f} TB"
20
21def run_compression(input_file, level):
22 """Запустить сжатие с заданной степенью и вернуть время и размер"""
23 output_file = f"{input_file}.zstd-{level}"
24
25 start_time = time.time()
26
27 try:
28 # Запускаем zstd с указанной степенью сжатия
29 subprocess.run(
30 ['zstd', f'-{level}', input_file, '-o', output_file ],
31 check=True,
32 capture_output=True,
33 text=True
34 )
35 except subprocess.CalledProcessError as e:
36 print(f"Ошибка при сжатии с уровнем {level}: {e.stderr}")
37 return None, None
38
39 end_time = time.time()
40 elapsed_time = end_time - start_time
41
42 archive_size = get_file_size(output_file)
43
44 # Опционально: удалить архив после измерения
45 # os.remove(output_file)
46
47 return elapsed_time, archive_size
48
49def main():
50 input_file = "47news.mysql"
51
52 # Проверяем существование файла
53 if not Path(input_file).exists():
54 print(f"Ошибка: файл {input_file} не найден!")
55 sys.exit(1)
56
57 # Получаем исходный размер
58 original_size = get_file_size(input_file)
59
60 # Заголовок таблицы
61 print(f"\n{'Степень':<8} {'Время (сек)':<12} {'Размер':<12} {'Коэфф. сжатия':<15} {'Эффективность':<15}")
62 print("-" * 70)
63
64 results = []
65
66 # Прогоняем для степеней сжатия 1-19
67 for level in range(1, 20):
68 elapsed_time, archive_size = run_compression(input_file, level)
69
70 if elapsed_time is None:
71 continue
72
73 compression_ratio = original_size / archive_size
74 efficiency = compression_ratio / elapsed_time
75
76 results.append({
77 'level': level,
78 'time': elapsed_time,
79 'size': archive_size,
80 'ratio': compression_ratio,
81 'efficiency': efficiency
82 })
83
84 # Выводим строку таблицы
85 print(f"{level:<8} {elapsed_time:<12.2f} {format_size(archive_size):<12} {compression_ratio:<15.2f} {efficiency:<15.2f}")
86
87 # Выводим итоговую информацию
88 print("\n" + "="*70)
89 print(f"Исходный файл: {input_file}")
90 print(f"Исходный размер: {format_size(original_size)} ({original_size:,} байт)")
91 print("="*70)
92
93 # Находим лучший результат по эффективности
94 if results:
95 best_efficiency = max(results, key=lambda x: x['efficiency'])
96 print(f"\nЛучшая эффективность (коэфф.сжатия/время):")
97 print(f" Степень сжатия: {best_efficiency['level']}")
98 print(f" Время: {best_efficiency['time']:.2f} сек")
99 print(f" Размер: {format_size(best_efficiency['size'])}")
100 print(f" Коэффициент сжатия: {best_efficiency['ratio']:.2f}")
101 print(f" Эффективность: {best_efficiency['efficiency']:.2f}")
102
103if __name__ == "__main__":
104 main()