Разработайте тестовую стратегию для функции, которая принимает в качестве входа файл большого размера (несколько гигабайт) и должна посчитать уникальные строки с ограниченной памятью

17 Ноя в 06:52
4 +1
0
Ответы
1
Коротко — сначала варианты реализации, затем конкретная тестовая стратегия и набор тестов/метрик.
1) Возможные реализации (для выбора и тестирования)
- Точный подсчёт:
- Разбиение по хэшу (external hashing/partitioning): файл разбивается на kkk бакетов по h(line) mod kh(line)\bmod kh(line)modk; каждый бакет помещается в память и в нём считается множество, затем суммируются уникальные.
- Внешняя сортировка: отсортировать строки внешним алгоритмом (sort + merge), пройти и посчитать границы групп.
- Приближённый подсчёт (меньше памяти, допускает ошибку):
- HyperLogLog (HLL) — даёт оценку числа уникальных с относительной ошибкой ~1.04m\frac{1.04}{\sqrt{m}}m 1.04 при mmm регистрах.
- Bloom/quotient-filter для дедупликации + внешнее хранение (если нужен булев «видел/не видел»).
2) Ключевые критерии тестирования
- Корректность (точность/ошибка).
- Устойчивость к ограничениям памяти и диска (максимальная пиковая память, диск).
- Проходимость для очень больших файлов (время, I/O).
- Поведение при краевых данных (пустые строки, очень длинные строки, разные кодировки, бинарный контент).
- Устойчивость к неблагоприятному распределению хэша (skew).
- Параллелизм/синхронизация и отказоустойчивость (обрыв, переполнение диска).
3) Формула для выбора числа бакетов при partitioning
Если всего строк NNN, средняя длина строки sss (байт), доступная оперативная память MMM (байт), то нужно выбрать kkk такое, что ожидаемый размер одного бакета ≈N⋅sk≤M\approx \frac{N\cdot s}{k}\le MkNs M, т.е.
k≥N⋅sM. k \ge \frac{N\cdot s}{M}.
kMNs .

4) Набор тестов (ранжировать от простых к нагрузочным)
A — функциональные / корректность
- Пустой файл — ожидаемый результат 000.
- Один символ/одна строка — ожидаемый 111.
- Все строки одинаковы (файл длины LLL, все одинаковые) — ожидаемый 111.
- Все строки уникальны (файл из nnn уникальных строк, например n=103n=10^3n=103 или 10610^6106) — ожидаемый nnn.
- Смешанные дубли: заранее сгенерировать файл с известной долей уникальных, например N=106N=10^6N=106, уникальных U=105U=10^5U=105. Сравнить с эталоном (см. ниже).
- Краевые строки: пустые строки, пробелы, табы, разные окончания строк (\n\backslash n\n, \r\n\backslash r\backslash n\r\n), строки с нулевыми байтами и не-UTF8.
B — стабильность/границы
- Очень длинная строка длиной >M>M>M (например len=10 MB\text{len}=10\ \text{MB}len=10 MB) — убедиться, что стриминг/буферизация работает.
- Количество уникальных > 2312^{31}231 (испытание типа переполнения счётчика); проверка использования 64‑битного счётчика — проверять на значениях близких к 263−12^{63}-12631 при моделировании.
C — нагрузочные / производительность
- Файлы больших размеров: 1 GB, 10 GB, 100 GB1\ \text{GB},\ 10\ \text{GB},\ 100\ \text{GB}1 GB, 10 GB, 100 GB (или «несколько гигабайт» — например 5 GB5\ \text{GB}5 GB). Проверять:
- Время исполнения.
- Пиковая память (использовать профайлер / OS tools).
- Дисковое использование (для partitioning / spill files).
- Тесты с ограниченной памятью: запускать с ограничением памяти MMM (например M=100 MBM=100\ \text{MB}M=100 MB, M=500 MBM=500\ \text{MB}M=500 MB) и проверять, что алгоритм корректно «спиллит» на диск и не выходит за лимит.
D — устойчивость к неблагоприятному хеш‑распределению
- Сгенерировать данные так, чтобы хэш большинства строк попадал в один бакет (адверсариальный набор) и проверить, что алгоритм обнаружит переполнение/склон к деградации и обработает (уведомление/увеличение kkk / fallback на внешнюю сортировку).
E — тесты для приближённых алгоритмов (HyperLogLog)
- Проверять среднюю относительную ошибку на наборе входов: запустить ttt раз (с разными seed'ами), посчитать среднюю относительную ошибку ∣estimate−true∣true\frac{|estimate - true|}{true}trueestimatetrue и сравнить с теоретическим пределом ≈1.04m\approx \frac{1.04}{\sqrt{m}}m 1.04 .
- Тест на малые UUU (где HLL может иметь большую погрешность) и на большие UUU.
F — отказоустойчивость / негативные сценарии
- Прерывание выполнения (SIGTERM) — есть ли корректная очистка/частичный результат/чекпоинт.
- Заполнение диска при записи бакетов → корректные ошибки и откат.
- Повреждённые входные блоки / неполные строки.
5) Как валидировать корректность для больших файлов (эталон)
- Для малых/средних файлов: использовать in-memory эталон (set) или системный sort + uniq, сравнивать точные числа.
- Для больших файлов, где эталон тяжёл: проверить на подвыборках (стримовый сэмплинг с известной статистикой) либо сравнить результат двух независимых алгоритмов (например partitioning vs external sort) на тех же данных; для приближённых методов оценивать доверительный интервал и относительную ошибку.
6) Тестовые данные — как генерировать
- Генератор с параметрами: NNN (число строк), распределение длин (константное, экспоненциальное), дублирование (dup ratio), алфавит (ASCII, UTF‑8, бинар).
- Семена для воспроизводимости.
- Наборы: «малые» N=103N=10^3N=103, «средние» N=106N=10^6N=106, «большие» N∼108N\sim 10^8N108 (в зависимости от среды).
7) Метрики и пороги
- Пиковая RAM ≤Mallowed\le M_{allowed}Mallowed .
- Время обработки на файл FFF — установить SLA (например T(F)T(F)T(F) не более допустимого).
- Точность для приближённых: средняя относительная ошибка ≤\le заданного порога (например ≤1%\le 1\%1% при выбранных mmm).
- Диск временных файлов — логирование и лимиты.
8) Автоматизация тестов
- Пайплайн: unit → интеграционные → нагрузочные.
- Использовать контейнеры с лимитами памяти для воспроизведения ограничений.
- Автоматизированные проверки пикового потребления памяти и I/O (perf, /usr/bin/time, cgroups, valgrind massif, Linux perf).
Короткие контрольные примеры (для ручной проверки):
- пусто → 000 - одна строка → 111 - файл из 10610^6106 строк, уникальных ровно 10510^5105 (генератор) → проверка совпадения.
Итог: тестовая стратегия должна покрывать функциональность (корректность), поведение при ограниченной памяти (partitioning/fallback), производительность и статистику ошибок (для HLL). Для каждой реализации подготовить набор воспроизводимых генераторов данных, метрик (RAM/IO/время) и сценариев отказа.
17 Ноя в 07:01
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир