Skip to content

Latest commit

 

History

History
237 lines (192 loc) · 10.4 KB

File metadata and controls

237 lines (192 loc) · 10.4 KB

🔧 Улучшения валидации экспорта

📋 Описание изменений

Дата: 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

Преимущества:

  • Компактный вывод - вся информация в структурированном виде
  • Группировка по категориям - легко найти проблемные области
  • Статистика по диапазонам - понимание масштаба проблем
  • Детализация при необходимости - показ конкретных файлов для малых групп

🔧 Техническая реализация

Новые методы в SplitConverter:

1. validate_export() - основной метод

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])

2. _group_warnings() - группировка по категориям

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)
        # Показ деталей или статистики

3. _group_by_ranges() - группировка по диапазонам

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}

📊 Результаты тестирования

Тест 1: Оптимизированная версия

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 файл (показан конкретный файл)

Тест 2: Максимальная версия

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 файл (показан конкретный файл)

🎯 Логика группировки

Правила отображения:

  1. ≤3 файла в группе: Показываются все файлы с размерами
  2. >3 файла в группе: Показывается статистика по диапазонам
  3. Диапазоны: 50-60KB, 60-70KB, 70-80KB, 80-90KB, 90+KB
  4. Категории: Группировка по папкам (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)

📈 Преимущества улучшений

1. Читаемость

  • Компактный вывод - вместо сотен строк только структурированная информация
  • Быстрый анализ - сразу видно масштаб проблем
  • Логическая группировка - по категориям и диапазонам

2. Информативность

  • Общая статистика - общее количество файлов и проблем
  • Детализация - конкретные файлы для малых групп
  • Средние значения - понимание типичных размеров

3. Практичность

  • Быстрое принятие решений - сразу понятно, нужно ли что-то менять
  • Фокус на проблемах - внимание на категории с наибольшими проблемами
  • Масштабируемость - работает с любым количеством файлов

🔮 Возможные дальнейшие улучшения

1. Цветной вывод

# Добавить цветовую индикацию
print(f"\033[32m✅ Валидных: {valid_files}\033[0m")
print(f"\033[33m⚠️  Превышение размера: {len(size_warnings)}\033[0m")

2. Экспорт в файл

# Сохранение отчета в JSON/CSV
def export_validation_report(self, output_file: str):
    """Экспортирует отчет валидации в файл"""

3. Интерактивные подсказки

# Рекомендации по настройкам
if len(size_warnings) > total_files * 0.8:
    print("💡 Рекомендация: уменьшите --max-file-size")

✅ Заключение

Улучшения валидации успешно реализованы:

  1. ✅ Группировка предупреждений - компактный и информативный вывод
  2. ✅ Статистика по категориям - быстрое понимание проблемных областей
  3. ✅ Диапазоны значений - детализация без спама
  4. ✅ Адаптивное отображение - детали для малых групп, статистика для больших

Результат: Вместо сотен строк предупреждений теперь получаем структурированный отчет, который легко анализировать и принимать решения на его основе.