Программа для сортировки большого файла (до 1ТБ) с использованием ограниченного объема оперативной памяти (500МБ).
Для решения задачи используется алгоритм внешней сортировки, который работает в три этапа:
- Разбиение исходного файла на части — файл разделяется на небольшие фрагменты, которые могут быть обработаны в памяти (примерно 400МБ).
- Сортировка каждой части в памяти — каждый фрагмент сортируется и сохраняется обратно на диск.
- Слияние отсортированных частей — отсортированные фрагменты объединяются в единый выходной файл с использованием алгоритма k-путевого слияния.
- Эффективная потоковая обработка данных с использованием
Stream API - Потребление памяти контролируется и не превышает указанного лимита
- Оптимизация дисковых операций для повышения производительности
- Параллельная обработка с использованием
worker_threadsдля сортировки отдельных фрагментов - Иерархическое слияние для обработки большого количества фрагментов
- Подробная диагностика и отчеты о прогрессе
- Node.js 14+ (тестировалось на версии 16)
- Достаточно дискового пространства для временных файлов (примерно 2x размер входного файла)
- Клонировать репозиторий:
git clone https://github.com/topmonroe9/external-sort.git
cd external-sort- Установить зависимости:
npm install- Запустить сортировку:
node src/index.js <путь-к-входному-файлу> <путь-к-выходному-файлу> [объем-памяти-в-мб]Например:
node src/index.js data/large-file.txt data/sorted-file.txt 400<путь-к-входному-файлу>— путь к большому файлу, который нужно отсортировать<путь-к-выходному-файлу>— путь, куда будет записан отсортированный файл[объем-памяти-в-мб]— опциональный параметр, указывающий максимальный объем используемой памяти в МБ (по умолчанию 400МБ)
src/index.js— главный модуль, координирующий весь процесс сортировкиsrc/splitter.js— модуль для разделения большого файла на частиsrc/sorter.js— модуль для сортировки отдельных частейsrc/merger.js— модуль для слияния отсортированных частейsrc/utils.js— вспомогательные функции
Для генерации тестового файла можно использовать функцию createTestFile из модуля utils.js:
const { createTestFile } = require("./src/utils");
// Создать тестовый файл размером 1GB со случайными строками
createTestFile("data/test-file.txt", 1024)
.then(() => console.log("Test file created"))
.catch(console.error);- Временная сложность: O(N × log(N) + N × log(K)), где N — общее количество строк, K — количество фрагментов
- Пространственная сложность: O(M + K), где M — максимальный объем используемой памяти, K — количество фрагментов
- Поддержка пользовательских функций сравнения для сортировки по определенным полям
- Возможность сортировки по нескольким полям
- Мониторинг использования памяти и автоматическая корректировка размера фрагментов
- Программа предполагает, что каждая строка входного файла может поместиться в память
- Для оптимальной производительности рекомендуется использовать SSD для временных файлов
- При работе с очень большими файлами (близкими к 1ТБ) убедитесь, что у вас достаточно дискового пространства
MIT