0.md
· 5.9 KiB · Markdown
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
```
-
* 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
· 3.8 KiB · Python
Eredeti
#!/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()
| 1 | #!/usr/bin/env python3 |
| 2 | |
| 3 | import subprocess |
| 4 | import time |
| 5 | import os |
| 6 | import sys |
| 7 | from pathlib import Path |
| 8 | |
| 9 | def get_file_size(filepath): |
| 10 | """Получить размер файла в байтах""" |
| 11 | return os.path.getsize(filepath) |
| 12 | |
| 13 | def 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 | |
| 21 | def 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 | |
| 49 | def 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 | |
| 103 | if __name__ == "__main__": |
| 104 | main() |