Pull to refresh

Comments 60

спасибо. интересно было почитать.
проникся) тяжеловато, конечно, для кропотливого анализа… особенно в понедельник вечером)
использовать фаил как-то не кошерно, интересно сжать массив в памяти в питоне можно?
Сжимать не нужно. В данном случае можно еще ускориться используя bin/bucket/postman алгоритмы — тогда в конце слияние фактически не нужно будет делать в том виде, как это делает merge — достаточно будет просто склеить файлы. Если быть особенным извращенцем, то большой файл можно склеить из кусочков минуя чтение и запись — тупо объединив иноды, кластеры (или еще че в зависимости от FS) в один файл напрямую редактируя FS :)

Собственно гря в этом случае, как я понял до алгоритмов не дошло. Просто использовался трюк с (относительно неэффективным) разбиением на более мелкие куски.

А если вникнуть глубже в задачу, то можно специализировать алгоритм на тип данных, что может привести к тому, что в кусках, которые получаются после предварительной псевдо-сортировки, уже можно сравнивать даже не все 32 бита, а только половину, поскольку, например, старшие два байта в куске у всех чисел могут быть одинаковы :) +SMP, GPGPU и т.п. Пространства для оптимизации весьма и весьма много.
В переводе написано «2 мегабайтах памяти на Питон» и получается что автор просто из оперативной памяти перекинул на жесткий диск, что кажется нарушением условий задачи, в оригинале же же неоднозначности нет «in 2 megabytes of RAM».
ну где-то же должны лежать эти числа до сортировки и после сортировки
можно было бы усложнить решение условием, что суммарный объём оперативной памяти и создаваемых файлов не должен превышать двух мегабайт, но это тоже решаемо
Н. Вирт «Алгоритмы + Структуры данных = Программы» ;)
Вот интересно тут сделать раздел, в котором классические алгоритмы будут реализовываться энтузиастами на разных языках программирования. Это был-бы отличный (от холивара :) ) способ померяться сравнить элегантность реализации того или иного алгоритма на разных языках.
Идея очень неплохая, было бы интересно почитать грамотный код на разных языках. Глядишь и выучить что-то новое захочется)

Думаю стоит написать статью для затравки, например про реализации каких-нибудь сбалансированных деревьев
UFO just landed and posted this here
UFO just landed and posted this here
Только тяжело будет Хаскелю в даже 4 мегабайтах
UFO just landed and posted this here
Сорри, я не знаю питон, но по описанию алгоритма видится мне что сортируются отдельные файлы (куски исходного) в адресном пространстве оного (т.е по 10 000 интов), и выплевываются в временный файл, но записи уже хранящиеся в временных файла никак не увязанны между собой… ну и какая же это сортировка тогда?
поправьте если я не прав…
В данном случае heapq.merge возвращает итератор, который позволит читать из потоков отсортированных файлов в нужном порядке, сбрасывая по 1000 штук в конечный файл.
ну так это тогда имхо совсем не решение задачи, т.к. система все равно даст один из вариантов:
1. Подгрузит эти данные в память от имени другого процесса и объем памяти при выполнении далеко привысит поставленный в задаче
2. она будет делать кучу операций чтения/записи, что сильно замедлит работу процесса…
или я не понял исходной задачи?
сорри — просто самому интересно стало каким образом тут все происходит… может быть если в вышесказанном я не прав, то опишите подробнее алгоритм?
Кэширование дисковых операций — это необязательное выделение памяти. т.е. она выделится только если есть свободная, но в принципе будет работать и без неё (чего не скажешь о выделении памяти под буфер для сортировки самой программой). А производительность алгоритма в условиях задачи не озвучена ;)
В Питоне есть такая штука, как генератор. В общих чертах, это такая последовательность, члены которой вычисляются тогда, когда к ним обращаются. Обратите внимание на оператор yield.
UFO just landed and posted this here
Это функция не подгружает все значения в память сразу, а будет грузить поочереди. В том и задача, чтоб не забить 2 мегабайта памяти сразу. Да, операций чтения будет достаточно много, но задача минимальной работы с диском и не требует.
В 23 строке данные из временных файлов загружаются в iters, а в 26 происходит слияние.
зачем каверкать русский язык?
int'ов — чисел
Я думаю, тут имелся ввиду типа данных.
«число» — понятие растяжимое. Оно может быть и 8 и 128 битным. Вот например я не вижу ничего сложного в сортировке миллиона 8-ми битных чисел в оперативной памяти т.к. они будут занимать 1Mb а по условию задачи нам выделяется 2.
Автор же имел ввиду тип int — 32-х битное целое. Миллион таких чесел «весит» 4Mb и без дополнительных ухищрений их в оперативной памяти не отсортировать ибо не влезут)
в заголовке и названии статьи — норм. В середине везде — не норм.

— it reads up to 1000 integers at a time
— он считывает до 1000 int'ов за раз

чуете чем попахивает?
Думаю что писать «до 1000 32-битных int'ов» слишком громоздко. По названию и вступлению и так уже все поняли что эти int'ы 32-х битные.
тьфу да это-то тут при чём.

прекратите смотреть на все что видите с точки зрения разработчика — это переводится просто «он считывает до 1000 чисел за раз». Всё. Никаких тут 32-битных int'ов и прочих вещей.
А с какой точки зрения нужно смотреть? Химика-генетика?
Статья имеет явно выраженный программистский контекст. А в этом контексте перевод «1000 чисел за раз» — некорректен.
Боюсь, я сейчас сломаю Вашу картину мира, но числа бывают не только целые. Более того: целые числа бывают не только int. Надеюсь, это было не очень больно…

Возвращаясь к вопросу: разумеется, int — это число. Но переводить «1000 integers» как «1000 чисел» — неверно. Вот такой, панимашь, парадокс.
> но числа бывают не только целые. Более того: целые числа бывают не только int.

Ба! А мужики-то не знают!

«1000 integers» — тысяча целых чисел (учел ошибку), ну никак не 1000 int'ов (фффуу. кстати, раз уж занудствуем, int'ы бывают не только 32-х битные)
Ну вот, уже лучше. Не просто «1000 чисел», а «1000 целых чисел».
А если быть ещё точнее, то «1000 целых 32-битных чисел» (о чём и идёт речь в статье). Автором подразумевалось именно это (ибо статья как раз об этом).
А т.к. статья написана программистом для программистов, то «программизм» «1000 int'ов» там более чем уместен, т.к. не оставляет двусмысленностей и лаконично доносит смысл. В отличие от «1000 чисел», которое вызывает кучу вопросов: «каких чисел?», «какой точности?» и т.д.
я думаю просто Василий поленился переводить) имелись ввиду целые числа…
Действительно, незачем — лучше уж писать англицизмы, чем коверкать русский язык.
В данном случае heapq.merge возвращает итератор, который позволит читать из потоков отсортированных файлов в нужном порядке, сбрасывая по 1000 штук в конечный файл.
Извините, не туда написал.
UFO just landed and posted this here
«100 жемчужин программирования»- первая задача, о сортировки при условии что в объем данных превышает объем доступной памяти.
UFO just landed and posted this here
Ничего что второй файл будет размером… я даже не назову сходу такой приставки, для 10^15 байт:)
UFO just landed and posted this here
Так вы же предлагаете во втором файле для каждого возможного значения иметь по соответствующему сдвигу количество таких чисел. Возможных значений 2^32, на количество надо по крайней мере 3 байта, итого имеем размер 12 гигабайт. Для такой задачи многовато, да и затраты по времени чтения/записи такого файла будут гигантскими
UFO just landed and posted this here
UFO just landed and posted this here
«Тоже» — это как Вы? Надеюсь, что нет:)

Расскажите-ка про свой алгоритм. Посмотрим, сколько Вам места понадобится…
UFO just landed and posted this here
Ага, уже 12 гигабайт:) Несколько больше 4 Мб, не так ли?

С петабайтом я ошибся, признаю. Но и 12 гигабайт приемлемыми назвать никак нельзя. И да, _в таком случае_ лучше «городить сотню файлов».
UFO just landed and posted this here
Вы тоже ненормальный? Я с самого начала говорил про Ваш второй файл. Перечитайте хистори.
UFO just landed and posted this here
habrahabr.ru/blogs/python/65503/#comment_1836028 — на мой вопрос о втором файле Вы начали гнать про 4 мегабайта _в первом_.

Идите уже, почитайте что-нибудь другое. Всё с Вами понятно.
существует типовое решение для сортировки, когда объем намного превышает RAM — четырехленточная сортировка.
Погуглил — не нашел, помогите
А, ну так это называется сортировка слиянием
Да, она, просто модифицированный вариант, рассчитанный на компьютеры с малой памятью
Гвидо там еще написал, что нужно молиться на heapq.merge, чем и собираюсь теперь заняться после прочтения оригинала.
Не очень наглядный пример) Вот если хотя бы 100 миллионов целых чисел.
Sign up to leave a comment.

Articles