Дата: 2024-12-19
Задача: Группировка предупреждений валидации для улучшения читаемости вывода
Статус: ✅ Завершено
⚠️ WARNING: data/max_split\objects\objects_071.json слишком большой (71.4KB > 50KB)
⚠️ WARNING: data/max_split\objects\objects_071.json слишком много строк (1565 > 500)
⚠️ WARNING: data/max_split\objects\objects_072.json слишком большой (79.9KB > 50KB)
⚠️ WARNING: data/max_split\objects\objects_072.json слишком много строк (1851 > 500)
⚠️ WARNING: data/max_split\objects\objects_073.json слишком большой (72.5KB > 50KB)
⚠️ WARNING: data/max_split\objects\objects_073.json слишком много строк (1583 > 500)
...
Проблемы:
- ❌ Спам в выводе - сотни отдельных предупреждений
- ❌ Сложность анализа - трудно понять общую картину
- ❌ Потеря важной информации - статистика скрыта в потоке текста
📊 Статистика валидации:
Всего файлов: 611
✅ Валидных: 3
⚠️ Превышение размера: 544
⚠️ Превышение строк: 64
⚠️ Файлы с превышением размера (50KB):
📁 objects: 540 файлов
50-60: 44 файлов (среднее: 55.8KB)
60-70: 87 файлов (среднее: 64.9KB)
70-80: 253 файлов (среднее: 76.4KB)
80-90: 155 файлов (среднее: 82.0KB)
objects_002.json: 119.4KB
Преимущества:
- ✅ Компактный вывод - вся информация в структурированном виде
- ✅ Группировка по категориям - легко найти проблемные области
- ✅ Статистика по диапазонам - понимание масштаба проблем
- ✅ Детализация при необходимости - показ конкретных файлов для малых групп
def validate_export(self, output_dir: str):
"""Проверяет созданные файлы на соответствие лимитам с группировкой предупреждений"""
# Сбор статистики
total_files = 0
valid_files = 0
size_warnings = []
lines_warnings = []
# Проверка файлов
for root, dirs, files in os.walk(output_dir):
for file in files:
if file.endswith('.json') and not file.endswith('_index.json'):
# Проверка лимитов и сбор предупреждений
# Вывод группированной статистики
print(f"📊 Статистика валидации:")
print(f" Всего файлов: {total_files}")
print(f" ✅ Валидных: {valid_files}")
print(f" ⚠️ Превышение размера: {len(size_warnings)}")
print(f" ⚠️ Превышение строк: {len(lines_warnings)}")
# Группировка предупреждений
if size_warnings:
self._group_warnings(size_warnings, "размер", lambda x: x[1])def _group_warnings(self, warnings: List[tuple], warning_type: str, value_extractor):
"""Группирует предупреждения по категориям и диапазонам"""
# Группировка по категориям
categories = {}
for file_path, value in warnings:
category = file_path.split(os.sep)[-2]
if category not in categories:
categories[category] = []
categories[category].append((file_path, value))
# Вывод по категориям с группировкой по диапазонам
for category, items in sorted(categories.items()):
print(f" 📁 {category}: {len(items)} файлов")
ranges = self._group_by_ranges(items, value_extractor)
# Показ деталей или статистикиdef _group_by_ranges(self, items: List[tuple], value_extractor) -> Dict[str, List[tuple]]:
"""Группирует элементы по диапазонам значений"""
ranges = {
"50-60": [],
"60-70": [],
"70-80": [],
"80-90": [],
"90+": []
}
# Распределение по диапазонам
for item in items:
value = value_extractor(item)
if value <= 60:
ranges["50-60"].append(item)
elif value <= 70:
ranges["60-70"].append(item)
# ... и так далее
return {k: v for k, v in ranges.items() if v}python run.py --mode optimized-split --max-file-size 50 --max-items-per-file 50Результат:
- Всего файлов: 52
- Валидных: 1
- Превышение размера: 45 файлов
- Превышение строк: 6 файлов
Группировка:
objects: 41 файл (70-80KB: 8 файлов, 80-90KB: 30 файлов)functions: 2 файла (показаны конкретные файлы)methods: 1 файл (показан конкретный файл)
python run.py --mode max-split --max-file-size 50 --max-items-per-file 50Результат:
- Всего файлов: 611
- Валидных: 3
- Превышение размера: 544 файла
- Превышение строк: 64 файла
Группировка:
objects: 540 файлов (статистика по диапазонам)functions: 2 файла (показаны конкретные файлы)methods: 1 файл (показан конкретный файл)
- ≤3 файла в группе: Показываются все файлы с размерами
- >3 файла в группе: Показывается статистика по диапазонам
- Диапазоны: 50-60KB, 60-70KB, 70-80KB, 80-90KB, 90+KB
- Категории: Группировка по папкам (objects, functions, methods, etc.)
Мало файлов (≤3):
📁 functions: 2 файлов
functions_001.json: 78.9KB
functions_002.json: 73.7KB
Много файлов (>3):
📁 objects: 540 файлов
50-60: 44 файлов (среднее: 55.8KB)
60-70: 87 файлов (среднее: 64.9KB)
70-80: 253 файлов (среднее: 76.4KB)
80-90: 155 файлов (среднее: 82.0KB)
- ✅ Компактный вывод - вместо сотен строк только структурированная информация
- ✅ Быстрый анализ - сразу видно масштаб проблем
- ✅ Логическая группировка - по категориям и диапазонам
- ✅ Общая статистика - общее количество файлов и проблем
- ✅ Детализация - конкретные файлы для малых групп
- ✅ Средние значения - понимание типичных размеров
- ✅ Быстрое принятие решений - сразу понятно, нужно ли что-то менять
- ✅ Фокус на проблемах - внимание на категории с наибольшими проблемами
- ✅ Масштабируемость - работает с любым количеством файлов
# Добавить цветовую индикацию
print(f"\033[32m✅ Валидных: {valid_files}\033[0m")
print(f"\033[33m⚠️ Превышение размера: {len(size_warnings)}\033[0m")# Сохранение отчета в JSON/CSV
def export_validation_report(self, output_file: str):
"""Экспортирует отчет валидации в файл"""# Рекомендации по настройкам
if len(size_warnings) > total_files * 0.8:
print("💡 Рекомендация: уменьшите --max-file-size")Улучшения валидации успешно реализованы:
- ✅ Группировка предупреждений - компактный и информативный вывод
- ✅ Статистика по категориям - быстрое понимание проблемных областей
- ✅ Диапазоны значений - детализация без спама
- ✅ Адаптивное отображение - детали для малых групп, статистика для больших
Результат: Вместо сотен строк предупреждений теперь получаем структурированный отчет, который легко анализировать и принимать решения на его основе.