@mkone112
Начинающий питонист.

Как эффективно и лаконично отсортировать файл из строк не вмещающихся в память?

На собесе попросили написать код, сортирующий файл размером 1tb, каждая строка - число размером 2гб. Ограничение памяти 500мб, время на решение ~10 минут.
Я не очень понимаю как такое решать, есть бы хотя бы несколько строк помещалось в память - я бы разбил файл на сортированные куски и слил бы их через merge sort. Учитывая что в память целиком не помещается даже одна строка - я бы итерировался по каждой по отдельности пока не наткнулся бы на разные разряды... Но все это обрывки идей которые никак не превращаются в реализованный алгоритм. Как может выглядеть алгоритм решающий задачу, который можно реализовать на собесе за отведенные 10 минут времени?
  • Вопрос задан
  • 562 просмотра
Решения вопроса 2
Adamos
@Adamos
А зачем вам вся строка для сортировки?
Вам она нужна только до того байта, который не совпадет с другими строками.
Взять от каждой строки по 64Kб, отранжировать по отличиям в этой части, продолжить читать только у тех, у которых она совпадает. Повторять чтение кусков до прекращения совпадений.
Ответ написан
sergiks
@sergiks Куратор тега Алгоритмы
♬♬
Отдельные мысли:
1 Tb / 2 Gb = 500 чисел, не много.

Сначала собрать массив индексов строк в отсортированном порядке.
После окончания сортировки записать финальный файл с реальными числами.

Merge Sort, да, хорош, потому что O(n log n)

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

Все 500 можно считывать маленькими шажками от старших регистров к младшим.
Считали 500 блоков (по килобайту?) – расставили в порядке.
Далее считываем следующие блоки только для тех из 500, что на предыдущем сравнении оказались равными.

И т.д. пока все равенства не разрешатся, или пока числа не кончатся )
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@garbagecollected
Если доступен bash

sort -g -S500M -o /path/to/output.txt /path/to/input.txt
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы