<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta>
      <journal-title-group>
        <journal-title>Series</journal-title>
      </journal-title-group>
      <issn pub-type="ppub">1613-0073</issn>
    </journal-meta>
    <article-meta>
      <title-group>
        <article-title>Revize metod externího trˇídeˇní pro moderní hardware</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Martin Kruliš</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Miroslav Cˇ ermák</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Zbyneˇk Falt a Jakub Yaghob</string-name>
          <email>falt@ksi.mff.cuni.cz</email>
          <email>yaghob@ksi.mff.cuni.cz</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Katedra softwarového inženýrství, Matematicko-fyzikální fakulta, Univerzita Karlova v Praze</institution>
          ,
          <addr-line>Malostranské nám 25., Praha 1</addr-line>
        </aff>
      </contrib-group>
      <pub-date>
        <year>2013</year>
      </pub-date>
      <volume>1003</volume>
      <fpage>65</fpage>
      <lpage>68</lpage>
      <abstract>
        <p>Abstrakt: Metody externího trˇídeˇní, tedy trˇídeˇní využívajícího vneˇjší pameˇt', jsou velmi dobrˇe známy již mnoho desetiletí. Tyto metody byly pu˚ vodneˇ navrženy pro systémy s malým množstvím interní pameˇti a magnetickými páskami coby vneˇjší pameˇtí. Magnetické pásky jsou specifické cˇisteˇ sekvencˇním prˇístupem k datu˚ m, který také ovlivnil návrh metod externího trˇídeˇní. Pásky byly nahrazeny pevnými disky s magnetickými plotnami, které prˇinesly možnost náhodného prˇístupu k datu˚ m, avšak sekvencˇní prˇístup zu˚ stal nadále výrazneˇ výkonneˇjší. Veˇtšina hardwarových prˇedpokladu˚ , na kterých je externí trˇídeˇní postaveno se za poslední desetiletí výrazneˇ zmeˇnila, zejména s prˇíchodem SSD disku˚ a vývojem nonvolatilních pameˇtí. V tomto cˇlánku prˇedstavujeme nový prˇístup k externímu trˇídeˇní, který reflektuje parametry soucˇasného hardware. Dále prˇedkládáme empirické srovnání s již existujícími metodami, které se hojneˇ používají v soudobých systémech. Trˇídeˇní patrˇí k základním stavebním kamenu˚ m rˇady algoritmu˚ a aplikací. V databázových systémech patrˇí spolecˇneˇ s operací JOIN k nejpoužívaneˇjším operacím vu˚ bec. I prˇes rostoucí kapacity a klesající ceny operacˇních pameˇtí není vždy možné rˇešit tuto úlohu cˇisteˇ v rámci vnitrˇní pameˇti pocˇítacˇe. Pro tyto situace máme k dispozici algoritmy externího trˇídeˇní, které využívají diskové úložišteˇ k odkládání mezivýsledku˚ . Algoritmy vneˇjšího trˇídeˇní byly navrženy a zmapovány již v dobách, kdy se jako externí pameˇt' používaly magnetické pásky. I prˇes jejich pu˚ vodní cíle se tyto algoritmy s drobnými úpravami používají dodnes. Jejich hlavní nevýhodou je, že prˇedpoklady, ze kterých tyto algoritmy vychází dnes již neplatí. Nejvýznamneˇjší prˇedpoklady mu˚ žeme shrnout takto: • Externí pameˇt' je organizována sekvencˇneˇ, nebo je sekvencˇní prˇístup výrazneˇ výkonneˇjší. Máme k dispozici pouze malé množství externích pásek, resp. mu˚ žeme rozumneˇ pracovat pouze s malým množstvím otevrˇených souboru˚ .</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>Klícˇová slova: trˇídeˇní, vneˇjší pameˇt’, algoritmus,
optimalizace, moderní hardware
• Externí pameˇt’ je o mnoho rˇádu˚ pomalejší než interní
pameˇt’, takže dominantní složkou vyjadrˇující
cˇasovou složitost je pocˇet operací s externí pameˇtí.</p>
      <p>V tomto cˇlánku bychom rádi vyvrátili tyto prˇedpoklady
pomocí empirických experimentu˚ , jejichž cílem je
identifikovat vlastnosti soudobých pevných disku˚ s magnetickými
plotnami a SSD pevných disku˚ . Na základeˇ opravených
prˇedpokladu˚ pak navrhujeme zmeˇny pro algoritmy
vneˇjšího trˇídeˇní, které by meˇly znacˇneˇ vylepšit jejich výkon.</p>
      <p>Tento cˇlánek je organizován následovneˇ. Sekce 2
shrnuje prˇehled souvisejících prací zameˇrˇených na externího
trˇídeˇní. Popis soucˇasných algoritmu˚ se nachází v sekci 3.
Sekce 4 definuje nové prˇedpoklady o soucˇasném hardware
a na jejich základeˇ navrhuje zmeˇny v metodách externího
trˇídeˇní. Výsledky experimentu˚ , které podporují naše
záveˇry, se nachází v sekci 5 a sekce 6 uzavírá cˇlánek.
2</p>
    </sec>
    <sec id="sec-2">
      <title>Související výzkum</title>
      <p>
        Problém externího trˇídeˇní, tedy trˇídeˇní za použité vneˇjší
pameˇti, je jedním z hlavních problému˚ v oblasti algoritmu˚
pro externí pameˇt’. Cˇ ástecˇneˇ je tomu tak proto, že trˇídicí
operace tvorˇí signifikantní cˇást pocˇítacˇových operací [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ], a
cˇástecˇneˇ proto, že trˇídeˇní je du˚ ležitým paradigma v návrhu
efektivních algoritmu˚ nejen pro externí pameˇt’. Studium
teˇchto problému˚ a analýza algoritmu˚ používajících vneˇjší
pameˇt’ mají své pocˇátky prˇed více než 50ti lety v
Demuthoveˇ doktorské tezi [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ], která se zameˇrˇovala zejména na
trˇídeˇní. V 70tých letech provedl Knuth [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ] rozsáhlou studii
trˇídeˇní v rámci svých knih pojednávajících o umeˇní
moderního programování. V knize o trˇídeˇní a vyhledávání se
zabývá mimo jiné strategiemi výbeˇru a nahrazení a
metodami polyfázového slévání za použití magnetických pásek
a magnetických disku˚ . Od té doby vzniklo mnoho nových
a upravených algoritmu˚ pro trˇídeˇní za pomoci externí
pameˇti [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ], avšak všechny tyto metody sdílí spolecˇné
prˇedpoklady definované Knuthem.
      </p>
      <p>
        Datová komunikace mezi rychlou interní pameˇtí a
pomalejší externí pameˇtí je považována za úzké hrdlo prˇi
zpracování velikých dát [
        <xref ref-type="bibr" rid="ref11 ref2 ref7">2, 7, 11</xref>
        ]. Veˇtšina algoritmu˚ se
snaží dosáhnout odbourání tohoto úzkého hrdla
minimalizací pocˇtu vstupneˇ výstupních operací, optimální prací
s vyrovnávací pameˇtí [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ], nebo asynchronním nacˇítáním
dat [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ]. Další metodou je nasazení více pevných disku˚ ,
které se využívají bud’ nezávisle, nebo pomocí prokládání
(stripingu), který bývá cˇasto efektivneˇjší než
komplikované algoritmy pro nezávislé využití disku˚ [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ].
Nejnoveˇjším prˇístupem je využití distribuovaného prostrˇedí prˇi
vhodném rozdeˇlení dat a výpocˇtu˚ [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ]. Pokroku ve výkonu
disku˚ (prˇedevším SSD) si všimli také autorˇi energeticky
efektivních algoritmu˚ [
        <xref ref-type="bibr" rid="ref1 ref9">1, 9</xref>
        ], jejichž hlavním cílem je opeˇt
minimalizace pocˇtu diskových operací a tedy i
minimalizace cyklu˚ slévání.
3
      </p>
    </sec>
    <sec id="sec-3">
      <title>Existující metody vneˇjšího trˇídeˇní</title>
      <p>Veˇtšina algoritmu˚ externího trˇídeˇní má dveˇ cˇásti. V první
cˇásti se generují takzvané beˇhy, tedy sekvence setrˇídeˇných
dat. Druhá cˇást pak provádí postupné slévání teˇchto beˇhu˚,
dokud nevznikne beˇh jediný, který reprezentuje setrˇídeˇná
data. Algoritmy se však liší tím, jakým zpu˚sobem beˇhy
generují a jak je slévají.
3.1</p>
      <sec id="sec-3-1">
        <title>Generování beˇh u˚</title>
        <p>
          Nejjednodušší metodou je prˇímocˇaré generování beˇhu˚
pomocí jednoho bufferu1, jehož velikost je zvolena tak, aby
využíval veškerou dostupnou interní pameˇt’. Buffer je poté
naplneˇn vstupními daty a setrˇídeˇn vhodnou metodou
interního trˇídeˇní, naprˇíklad Quicksortem [
          <xref ref-type="bibr" rid="ref5">5</xref>
          ]. Data z bufferu
jsou následneˇ prˇesunuta do vneˇjší pameˇti, cˇímž je
vytvoˇren jeden beˇh. Tento postup je opakován, dokud se nachází
nezpracovaná data ve vstupním souboru.
        </p>
        <p>Na první pohled by se mohlo zdát, že není možné
generovat beˇhy delší, než je velikost vnitrˇní pameˇti. Existuje
drobné vylepšení, které zajišt’uje generování beˇhu˚ veˇtších
délek, pokud jsou vstupní data vhodneˇ koncipována. Tato
metoda používá dveˇ prioritní fronty (typicky
reprezentované 2-regulárními haldami), které se deˇlí o veškerou
dostupnou pameˇt’.</p>
        <p>Na pocˇátku zabírá první halda veškerou pameˇt’ a je
zcela naplneˇna daty ze vstupního souboru. V každém
kroku je z haldy odebráno minimum a zapsáno do práveˇ
generovaného beˇhu na disku. Jako náhrada za toto
minimum je ze vstupního souboru nacˇten další prvek. Pokud
je tento prvek veˇtší nebo roven prvku práveˇ zapsanému
do výstupního beˇhu, mu˚že být nový prvek zacˇleneˇn do
první haldy. Pokud je veˇtší, první halda zmenší svou
velikost o jedna a prvek je vložen do haldy druhé, která se
tím zárovenˇ zveˇtší. Generování beˇhu koncˇí v okamžiku,
kdy je první halda vycˇerpána a druhá zabírá celou pameˇt’.
V tomto okamžiku se prohodí význam obou hald a mu˚že
zacˇít generování dalšího beˇhu.</p>
        <p>Experimenty na náhodneˇ usporˇádaných datech s
uniformním rozložením ukazují, že beˇhy generované pomocí
dvou hald mají v pru˚meˇru dvojnásobnou délku, než je
velikost dostupné pameˇti.
3.2</p>
      </sec>
      <sec id="sec-3-2">
        <title>N-cestné dvoufázové trˇídeˇní</title>
        <p>Prˇedpokládejme, že daný systém je schopen otevrˇít
nejvýše N souboru˚, resp. mu˚že soucˇasneˇ používat nejvýše N
1Z du˚vodu nedostatku vhodné terminologie budeme v tomto cˇlánku
používat anglický termín buffer v jeho pocˇešteˇné podobeˇ.</p>
        <p>Obrázek 1: Princip dvoufázového trˇídeˇní
pásek. Nejjednodušší implementace slévání beˇhu˚ potom
využívá N − 1 souboru˚ jako vstup a jeden soubor pro
uchování výstupu. Na pocˇátku jsou prˇi generování beˇhy
rozdistribuovány rovnomeˇrneˇ mezi vstupní soubory. Proces
slévání pak pracuje iterativneˇ a každá iterace má dveˇ fáze. V
první fázi slévá soucˇasneˇ beˇhy z N − 1 souboru˚ a výsledné
beˇhy zapisuje do výstupního souboru. V druhé fázi je
prˇecˇten celý výstupní soubor a beˇhy z neˇj jsou rovnomeˇrneˇ
rozdistribuovány mezi vstupní soubory. Algoritmus koncˇí,
když ve výstupním souboru zu˚stane pouze jeden beˇh.</p>
        <p>Proces slévání je znázorneˇn na obrázku 1. Samotné
slévání probíhá ve vnitrˇní pameˇti a je možné jej
implementovat naprˇíklad pomocí prioritní fronty (tzn. haldy), která si
udržuje první dosud nezpracovaný prvek z každého beˇhu.</p>
        <p>Hlavní nevýhodou tohoto postupu je nutnost provádeˇt
opeˇtovnou redistribuci beˇhu˚ ve druhé fázi každé iterace.
Jedním z možných rˇešení, je použít pouze N/2 souboru˚
jako vstupních a generované beˇhy distribuovat rovnou
mezi N/2 výstupních souboru˚. Tento postup má ale
nevýhodu v tom, že slévá vždy pouze N/2 beˇhu˚ místo N − 1
beˇhu˚, díky cˇemuž mu˚že potrˇebovat veˇtší množství iterací.</p>
      </sec>
      <sec id="sec-3-3">
        <title>3.3 Polyfázové trˇídeˇní</title>
        <p>Hlavní nevýhodu dvoufázového trˇídeˇní do jisté míry rˇeší
polyfázové trˇídeˇní. Jeho idea spocˇívá v nerovnomeˇrné
distribuci beˇhu˚, která je chytrˇe navržena tak, aby bylo možné
beˇhy neustále slévat bez jejich opeˇtovného rozhazování.
Prˇitom je vždy N − 1 souboru˚ používáno jako vstupních a
výsledné beˇhy se ukládají do jednoho souboru.</p>
        <p>Cílem je, aby prˇi posledním slévání byl v každém z
N − 1 vstupních souboru˚ práveˇ jeden beˇh. V takovém
prˇípadeˇ probeˇhne poslední krok slévání optimálním
zpu˚sobem. Pocˇátecˇní rozložení beˇhu˚ lze dopocˇítat reverzním
naplánováním všech iterací slévání od optimální koncové
konfigurace. Situace pro N = 3 a 21 pocˇátecˇních beˇhu˚ je
znázorneˇna v následující tabulce.</p>
        <p>soubor zacˇ. #1 #2 #3 #4 #5 #6
#1
#2
#3
13
8
0
5
0
8
0
5
3
3
2
0
1
0
2
0
1
1
1
0
0</p>
        <p>Tabulka 1: Optimální slévání 21 beˇhu˚ pro N = 3
Na pocˇátku je v prvním souboru 13 beˇhu˚ a ve druhém
8. V každém kroku se vezme nejvyšší možný pocˇet beˇhu˚,
který je možný slít prˇímo (naprˇ. v prvním kroku 8), cˇímž se
Revize metod externího trˇídeˇní pro moderní hadware
vždy práveˇ jeden soubor uvolní. V prˇípadeˇ dvou vstupních
a jednoho výstupního souboru je rozložení beˇhu˚ založeno
na Fibonacciho cˇíslech.
4</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>Moderní prˇístup k vneˇjšímu trˇídeˇní</title>
      <p>V této sekci nastíníme nové prˇedpoklady o hardware,
zejména o pevných discích, a na jejich základeˇ opravíme
existující algoritmy vneˇjšího trˇídeˇní.
4.1</p>
      <sec id="sec-4-1">
        <title>Vlastnosti hardware</title>
        <p>Na základeˇ empirických pozorování, jejichž nejdu˚ležiteˇjší
výsledky jsou shrnuty v sekci 5, mu˚žeme postulovat
následující prˇedpoklady:
• Soudobé magnetické disky sice stále preferují
sekvencˇní prˇístup, avšak pokud je k datu˚m prˇistupováno
po dostatecˇneˇ velkých blocích (rˇádoveˇ jednotky až
desítky MB), je možné aplikovat nad teˇmito bloky
náhodný prˇístup bez výrazného poklesu výkonu. U SSD
disku˚ je možné používat i bloky menší.
• Pru˚meˇrná rychlost cˇtení a zápisu výrazneˇ pˇrevyšuje
rychlost vnitrˇního sériového trˇídeˇní a je srovnatelná
s rychlostí paralelního vnitrˇního trˇídeˇní (na beˇžneˇ
dostupném hardware).
• Použití prioritní fronty (resp. haldy) k vnitrˇnímu
trˇídeˇní je výrazneˇ pomalejší než použití Quicksortu.
• Soudobé operacˇní systémy zvládají bez problému˚
pracovat i s tisíci otevrˇenými soubory soucˇasneˇ.
• Pomeˇr velikosti vnitrˇní a vneˇjší pameˇti je na beˇžných
hardwarových konfiguracích menší než 1 : 1000.</p>
        <p>Z výše uvedených prˇedpokladu˚ vyplývají dveˇ veˇci.
Externí trˇídeˇní již není potrˇeba optimalizovat na pocˇet
diskových operací, nebot’ za beˇžných podmínek je možné
provést slévání všech vygenerovaných beˇhu˚ najednou. Díky
tomu je každý prvek práveˇ dvakrát cˇten z disku a práveˇ
dvakrát na disk zapsán. Za druhé, možnost paralelního
zpracování trˇídeˇných dat ve vnitrˇní pameˇti je výrazneˇ
du˚ležiteˇjší pro budoucí škálovatelnost, protože rychlost
pevných disku˚ již prˇesáhla propustnost trˇídicích algoritmu˚ pro
vnitrˇní pameˇt’.</p>
      </sec>
      <sec id="sec-4-2">
        <title>4.2 Zmeˇny v algoritmech</title>
        <p>Základní koncept externího trˇídeˇní zu˚stává nadále
nezmeˇneˇn. Každý algoritmus má tedy dveˇ cˇásti – generování
beˇhu˚ a jejich následné slévání. Tyto cˇásti jsou do jisté míry
nezávislé, a proto se jim mu˚žeme veˇnovat samostatneˇ.</p>
        <p>Prˇi generování beˇhu˚ jsme empiricky oveˇrˇili, že použití
dvou hald sice vede k vytvorˇení menšího pocˇtu delších
beˇhu˚, avšak tento proces je výrazneˇ pomalejší než
použití optimalizovaných algoritmu˚. Hledání minima pomocí
haldy navíc není možné (na rozdíl od ostatních trˇídicích
algoritmu˚) jednoduše paralelizovat. V tomto okamžiku se
jako nejvíce vhodný algoritmus jeví rozdeˇlení pameˇti na
dva (prˇípadneˇ trˇi) stejneˇ velké úseky, prˇicˇemž data v
jednom úseku jsou trˇídeˇna zatím co data ve druhém (a
prˇípadneˇ trˇetím) úseku jsou prˇenášena z disku nebo na disk.
Jako algoritmus vnitrˇního trˇídeˇní poslouží nejlépe
paralelní verze Quicksortu.</p>
        <p>
          Jak jsme již naznacˇili, samotný proces slévání je za
beˇžných okolností možné provést v jediném kroku. Pokud je
vnitrˇní pameˇt’ rˇádoveˇ prˇibližneˇ tisíckrát menší než nejveˇtší
možná data ve vneˇjší pameˇti, pak první cˇást trˇídeˇní
vygeneruje nejvýše tisíc beˇhu˚, které mu˚žeme mít uloženy v
tisíci nezávislých souborech. K samotnému slévání potom
mu˚žeme použít bud’ prioritní frontu, jak navrhuje Knuth
[
          <xref ref-type="bibr" rid="ref6">6</xref>
          ], nebo upravenou techniku paralelního proudového
slévání, kterou prˇedstavil ve své práci Falt [
          <xref ref-type="bibr" rid="ref4">4</xref>
          ].
5
        </p>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>Experimenty</title>
      <p>Experimenty byly provádeˇny na beˇžném PC s
procesorem Core i7 (4 fyzická, 8 logických jader) vybaveném
16 GB RAM. Data byla uložena na samostatném disku
(1 TB, 7200 otácˇek) a druhý (identický) disk byl použit
pro docˇasné soubory s vygenerovanými beˇhy. Testovací
data reprezentoval soubor 32 bitových celocˇíselných
hodnot, které byly náhodneˇ vygenerovány s uniformním
rozdeˇlením.</p>
      <p>První sada experimentu˚ zkoumá pomeˇr cˇasu˚ potrˇebných
k setrˇídeˇní bloku dat pomocí interního trˇídeˇní a cˇasy
potrˇebné k prˇecˇtení resp. zapsaní teˇchto dat na disk. Obrázek
2 prezentuje nameˇrˇené cˇasy pro ru˚zneˇ velké bloky dat a
srovnává jednovláknové trˇídeˇní Quicksortem s jeho
paralelní verzí. Z výsledku˚ je patrné, že cˇasy diskových
operací jsou výrazneˇ nižší, než doba potrˇebná k setrˇídeˇní dat
pomocí jednoho jádra a prˇibližneˇ srovnatelné s trˇídeˇním,
které využívá všech 8 logických jader procesoru.
Další experimenty se týkají generování beˇhu˚. V teˇchto
experimentech byl použit vstupní soubor o velikosti 64
GB (16 miliard cˇísel) a buffer pro vnitrˇní trˇídeˇní o
velikosti 1 GB (tedy pro 256 milionu˚ cˇísel). Tyto experimenty
srovnávají sériový prˇístup, který realizuje všechny diskové
operace i trˇídeˇní v jediném vlákneˇ, paralelní prˇístup, který
provádí diskové operace sérioveˇ, ale ke trˇídeˇní dat
využívá všechna dostupná vlákna, prˇístup založený na
pipeline, který provádí diskové operace asynchronneˇ a zárovenˇ
trˇídí paralelneˇ, a konecˇneˇ generování beˇhu˚ pomocí dvou
hald.
19738.6
2119.51
5243.34
3194.01</p>
      <p>1250
serial I/O
serial
parallel
pipeline 2−heap</p>
      <p>
        Obrázek 3: Cˇ asy potrˇebné pro generování beˇhu˚
Metoda generování beˇhu˚ pomocí dvou hald má sice
pozitivní dopad na délku (a tedy i pocˇet) beˇhu˚ [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ], avšak z
grafu na obrázku 3 je patrné, že tento postup je výrazneˇ
pomalejší z du˚ vodu znacˇného náru˚ stu výpocˇetních operací
a náhodnému prˇístupu do vnitrˇní pameˇti, který špatneˇ
využívá vyrovnávací pameˇti procesoru.
0
0
0
0
2
0
0
0
5
1
0
generate
merge
serial
parallel
pipeline
2−heap
      </p>
      <p>Obrázek 4: Celkové cˇasy externího trˇídeˇní</p>
      <p>Celkové cˇasy trˇídeˇní potom prezentuje obrázek 4. Ke
slévání beˇhu˚ byl použit mechanismus vícecestného slévání
pomocí 2-regulární haldy. Slévání 128 beˇhu˚ , které
vygenerovaly první trˇi metody trvalo prˇibližneˇ 2400 sekund,
zatímco slévání 64 beˇhu˚ vygenerovaných pomocí dvou hald
trvalo 3100 sekund. Tento prˇekvapivý výsledek se nám
zatím nepodarˇilo uspokojiveˇ vysveˇtlit.
6</p>
      <p>Záveˇr
V tomto cˇlánku jsme aktualizovali neˇkteré zažité
prˇedpoklady týkající se vneˇjších pameˇtí a na jejich základeˇ jsme
navrhli zmeˇny trˇídicích algoritmu˚ , které meˇly pozitivní
dopad na výkon a budoucí škálovatelnost. Prokázali jsme,
že pocˇet diskových operací již není hlavním kritériem
optimalizace teˇchto algoritmu˚ , ale vývoj je trˇeba smeˇrˇovat
do paralelních implementací. V pokracˇování této práce se
chceme zameˇrˇit na vylepšení vícecestného slévání pro
paralelní systémy a provést rozsáhlejší testy zejména za
použití diskových polí a SSD disku˚ .</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>Andreas</given-names>
            <surname>Beckmann</surname>
          </string-name>
          , Ulrich Meyer, Peter Sanders, and
          <string-name>
            <given-names>Johannes</given-names>
            <surname>Singler</surname>
          </string-name>
          .
          <article-title>Energy-efficient sorting using solid state disks</article-title>
          .
          <source>Sustainable Computing: Informatics and Systems</source>
          ,
          <volume>1</volume>
          (
          <issue>2</issue>
          ):
          <fpage>151</fpage>
          -
          <lpage>163</lpage>
          ,
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>Paolo</given-names>
            <surname>Bertasi</surname>
          </string-name>
          , Marco Bressan, and
          <article-title>Enoch Peserico. psort, yet another fast stable sorting software</article-title>
          .
          <source>Journal of Experimental Algorithmics (JEA)</source>
          ,
          <volume>16</volume>
          :
          <fpage>2</fpage>
          -
          <lpage>4</lpage>
          ,
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <surname>Howard</surname>
            <given-names>B</given-names>
          </string-name>
          <string-name>
            <surname>Demuth</surname>
          </string-name>
          .
          <article-title>Electronic data sorting</article-title>
          . Dept. of Electrical Engineering,
          <year>1956</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>Zbyneˇk</given-names>
            <surname>Falt</surname>
          </string-name>
          , Martin Kruliš, and
          <string-name>
            <given-names>Jakub</given-names>
            <surname>Yaghob</surname>
          </string-name>
          .
          <article-title>Optimalizace trˇídicích algoritmu˚ pro systémy proudového zpracování dat</article-title>
          .
          <source>Informacˇné Technológie - Aplikácie a Teória</source>
          , pages
          <fpage>69</fpage>
          -
          <lpage>74</lpage>
          ,
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>C.A.R.</given-names>
            <surname>Hoare</surname>
          </string-name>
          . Quicksort. The
          <source>Computer Journal</source>
          ,
          <volume>5</volume>
          (
          <issue>1</issue>
          ):
          <fpage>10</fpage>
          ,
          <year>1962</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>Donald</given-names>
            <surname>Ervin</surname>
          </string-name>
          <string-name>
            <surname>Knuth</surname>
          </string-name>
          ,
          <source>Donald Ervin Knuth, and Donald Ervin Knuth. Sorting and Searching. Addison-Wesley</source>
          ,
          <year>2003</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>Chris</given-names>
            <surname>Nyberg</surname>
          </string-name>
          , Tom Barclay, Zarka Cvetanovic, Jim Gray, and
          <string-name>
            <given-names>Dave</given-names>
            <surname>Lomet</surname>
          </string-name>
          .
          <article-title>Alphasort: A cache-sensitive parallel external sort</article-title>
          .
          <source>The VLDB Journal - The International Journal on Very Large Data Bases</source>
          ,
          <volume>4</volume>
          (
          <issue>4</issue>
          ):
          <fpage>603</fpage>
          -
          <lpage>628</lpage>
          ,
          <year>1995</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>Alexander</given-names>
            <surname>Rasmussen</surname>
          </string-name>
          ,
          <string-name>
            <given-names>George</given-names>
            <surname>Porter</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Michael</given-names>
            <surname>Conley</surname>
          </string-name>
          , Harsha V Madhyastha, Radhika Niranjan Mysore, Alexander Pucher, and
          <string-name>
            <given-names>Amin</given-names>
            <surname>Vahdat</surname>
          </string-name>
          .
          <article-title>Tritonsort: A balanced largescale sorting system</article-title>
          .
          <source>In Proceedings of the 8th USENIX conference on Networked systems design and implementation</source>
          , pages
          <fpage>3</fpage>
          -
          <lpage>3</lpage>
          . USENIX Association,
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>Vijay</given-names>
            <surname>Vasudevan</surname>
          </string-name>
          , Lawrence Tan,
          <string-name>
            <given-names>Michael</given-names>
            <surname>Kaminsky</surname>
          </string-name>
          , Michael A Kozuch, David Andersen,
          <string-name>
            <given-names>and Padmanabhan</given-names>
            <surname>Pillai</surname>
          </string-name>
          . Fawnsort:
          <article-title>Energy-efficient sorting of 10gb</article-title>
          .
          <source>Sort Benchmark final</source>
          ,
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>Darren</given-names>
            <surname>Erik Vengroff</surname>
          </string-name>
          and
          <string-name>
            <given-names>J Scott</given-names>
            <surname>Vitter</surname>
          </string-name>
          .
          <article-title>Supporting i/oefficient scientific computation in tpie</article-title>
          .
          <source>In Parallel and Distributed Processing</source>
          ,
          <year>1995</year>
          . Proceedings. Seventh IEEE Symposium on, pages
          <fpage>74</fpage>
          -
          <lpage>77</lpage>
          . IEEE,
          <year>1995</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <surname>Jeffrey</surname>
            <given-names>Scott</given-names>
          </string-name>
          <string-name>
            <surname>Vitter</surname>
          </string-name>
          .
          <article-title>External memory algorithms and data structures: Dealing with massive data</article-title>
          .
          <source>ACM Computing surveys (CsUR)</source>
          ,
          <volume>33</volume>
          (
          <issue>2</issue>
          ):
          <fpage>209</fpage>
          -
          <lpage>271</lpage>
          ,
          <year>2001</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>