2015-06-16 20:34 GMT+02:00 Pavel Schön <pa...@schon.cz>:
> https://en.wikipedia.org/wiki/External_sorting

To je dobrá poznámka. Možná bude nejlepší to strčit do souboru a
zavolat unixovou utilitku sort :)

> Dne pondělí 15. června 2015 22:36:11 UTC+2 Lumír Balhar napsal(a):
>> Ahoj všem.
>>
>> Řeším s kamarádem jeden jeho projekt, jehož součástí je i Burrows-Wheelerova 
>> transformace, která se používá před kompresí dat společně s Move to Front 
>> transformací pro snížení entropie vstupních dat a tím zvýšení efektivity 
>> kompresního algoritmu, kterému tyto dvě transformace předcházejí.
>>
>> Pochopení transformací není potřeba. U BWT se využívá tzv, buffer, který 
>> obsahuje všechny možné rotace vstupních dat, takže například pro "ema má 
>> maso" vypadá takto:
>>
>>  0 ema ma maso
>>  1 ma ma masoe
>>  2 a ma masoem
>>  3  ma masoema
>>  4 ma masoema
>>  5 a masoema m
>>  6  masoema ma
>>  7 masoema ma
>>  8 asoema ma m
>>  9 soema ma ma
>> 10 oema ma mas
>>
>> Pro malá data je to dobré, ale pro velká nelze mít celý buffer v paměti, 
>> protože se pro každý vstupní znak navíc rozšíří o řádek i sloupec zároveň.
>> Napsal jsem tedy pro Buffer samostatnou třídu, kde pomocí __getitem__ 
>> vygeneruji potřebný řádek posunem až ve chvíli, kdy je jeho obsah potřeba.
>>
>> Základní buffer jsem tím vyřešil a ušetřil hromadu paměti. Problém ale je, 
>> že v dalším kroku potřebuji tento buffer lexikograficky seřadit. Abych jej 
>> opět nemusel cpát do paměti, vytvořil jsem pole indexů, kde každý index 
>> reprezentuje jeden řádek bufferu a řadím jen toto pole (čímž získám 
>> přeskládané pořadí řádků původního bufferu), ale jako klíč používám právě 
>> obsah řádku pro daný index.
>>
>> Konkrétně:
>>
>> class Buffer():
>>     def __init__(self, input):
>>         self.input = input
>>         self.indexes = [x for x in range(len(input))]
>>
>>     def __getitem__(self, index):
>>         return self.input[index:] + self.input[0:index]
>>
>>     def sort(self):
>>         self.indexes.sort(key=lambda x: self[x])
>>
>>
>> A teď jsme se dostali k jádru problému. I když se obsah jednotlivých řádků 
>> generuje až ve chvíli, kdy jsou potřeba, a řadit by se mělo jen relativně 
>> malé pole indexů, při volání funkce .sort() se jakoby stejně celé to pole 
>> nejdříve vytvoří v paměti, seřadí a pak se seřadí to cílové pole s indexy na 
>> základě obsahu bufferu.
>>
>> Existuje způsob, jak implementovat takovýto řadící algoritmus pro velký 
>> objem dat, aniž bych je měl v jednu chvíli všechny v paměti?
>>
>> Předem díky za nakopnutí tím správným směrem.
>> Lumír
>
> _______________________________________________
> Python mailing list
> python@py.cz
> http://www.py.cz/mailman/listinfo/python
>
> Visit: http://www.py.cz
_______________________________________________
Python mailing list
python@py.cz
http://www.py.cz/mailman/listinfo/python

Visit: http://www.py.cz

Odpovedet emailem