Зовнішнє сортування
Зовнішнє сортування — це клас алгоритмів сортування, який може обробляти величезну кількість даних. Зовнішнє сортування потрібне, коли сортовані дані не входять у основну пам'ять обчислювального пристрою (RAM), а замість цього вони повинні знаходитися в повільній зовнішній пам'яті, як правило, на жорсткому диску. Зовнішнє сортування зазвичай використовує гібридну стратегію сортування-злиття. У фазі сортування, шматки даних, достатньо малих для розміщення в основній пам'яті, прочитуються, сортуються та виводяться до тимчасового файлу. У фазі злиття сортовані субфайли об'єднуються в один великий файл. Зовнішнє сортування злиттямОдним з прикладів зовнішньої сортування є зовнішній алгоритм сортування злиттям, який сортує частини, кожна з яких входить у оперативну пам'ять, а потім об'єднує відсортовані частини.[1][2] Наприклад, для сортування 900 мегабайт даних, використовуючи лише 100 мегабайтів оперативної пам'яті:
Особливості методуПопередній приклад — це сортування в два кроки: спочатку сортування, а потім об'єднання. Сортування закінчується одиничним злиттям 9-ти частин, а не серією двосторонніх процесів злиття, як у типовому сортуванні злиття в пам'яті. Це відбувається тому, що кожене злиття передбачає читання та запис значення з диска і на нього. Обмеження для одиничного злиття полягає в тому, що при збільшенні кількості фрагментів пам'ять буде розділена на більшу кількість частин, тому кожна з них буде меншою. Це спричиняє велику кількість процесів читання малих частин даних, ніж меншу кількість більших. Таким чином, для сортування, скажімо, 50 Гб у 100 МБ оперативної пам'яті, використовуючи одиничне злиття неефективно: пошук на диску необхідний для заповнення вхідних фрагментів даних кожного з 500 шт. займаює більшу частину часу. Використання двох злиттів дозволяє вирішити проблему. Тоді процес сортування може виглядати так:
Як і у звичайному сортуванні, ефективний метод зовнішнього сортування вимагає часу O ( n log n ): експоненціальне збільшення розміру даних зумовдює лінійного збільшення кількості проходів. Використовуючи велику кількість пам'яті, надану сучасними комп'ютерами, логарифмічний фактор росте дуже повільно. До 500 Гб даних можна сортувати за допомогою 1 Гб основної пам'яті, перш ніж третє злиття стане вигідним, і значно більші об'єми даних, перш ніж в пригоді стане четверте злиття. Припустимо, що маємо диск з 200 MB / s читання/запису, час пошуку 20 мс, 1 Гб пам'яті, 500 Гб для сортування. Фаза злиття буде складатися з 500 частин по 2 МB, кожна з них витрачає по 250 мс на пошук, а потім читання та запис 500 ГБ. Буде витрачено 5000 секунд на пошук та 5000 секунд на перезапис. Використання двох пропусків, як описано вище, майже усунуло б час пошуку, але додасть ще 5000 секунд читання та запису, тому це приблизно точка беззбитковості між дво- і трипропускними віріантами сортування. Такі засоби, як твердотільні накопичувачі (SSD) також збільшують об'єм даних, які можна сортувати до того, як додаткові злиття стають вигідними. Об'єм основної пам'яті має важливе значення. Подвоєння пам'яті, призначеної для сортування, зменшує вдвічі кількість частин і кількість читань на шматочок, зменшуючи кількість шуканих необхідних приблизно на три чверті. Відношення обсягу оперативної пам'яті до накопичення дисків на серверах часто робить зручним виконувати сортування величезних об'ємів даних на кластері машин[3], а не на одній машині з декількома пропусками. Інші алгоритмиЗовнішнє сортування злиттям не є єдиним зовнішнім алгоритмом сортування; існують також «сортування розподілом», які працюють шляхом розбиття несортованих значень на менші, які можуть бути відсортовані в основній пам'яті. Подібно сортування злиттям, зовнішній сортування розподілом також має розділ основної пам'яті. Примітки
See alsoПосилання
|
Portal di Ensiklopedia Dunia