Portál AbcLinuxu, 19. dubna 2024 14:27


Dotaz: Trie v pythonu

13.4.2007 18:21 Pepa
Trie v pythonu
Přečteno: 128×
Odpovědět | Admin
DD, snazim se ulozit slovnik ze souboru (cca 6milionu slov - soubor ma asi 80MB, kazde zvlast na kazdem radku), do struktury Trie (co pismeno, to uzel - spolecne prefixy slov). Cilem je redukovat pametovy prostor zabrany vlastnim slovnikem. At se vsak problem snazim vyresit jakkoli, stale narazim na nedostatek pameti. Zkousel jsem jiz vnorene seznamy, slovniky a naposledy strukturu, neco ve smyslu:
class TNode:
        term, subNodes, data = None, (), None

        def __init__(self, data):
                self.data=data #vlastni pismeno
                self.subNodes=() #ntice poduzli
                self.term=None #ukoncovaci terminal

class tri:
        #############################
        def __init__(self):
                """
                Inicializace
                """
                self.root=self.addNode('#')

        ############################
        def add(self, word):
                """
                Prida slovo do slovniku
                """
                curNode=self.root
                for letter in word:
                        notInTree=True
                        for i in curNode.subNodes:
                                if i.data==letter:
                                        notInTree=False
                                        index=i
                                        break
                        if notInTree:
                                temp=list(curNode.subNodes)
                                temp.append(self.addNode(letter))
                                curNode.subNodes=tuple(temp)
                                index=curNode.subNodes[-1]
                        curNode=index
Ovsem i pri pouziti teto struktury, nactu-li vice nez 350 000 slov tak se pamet zabrana programem vysplha na nejakych cca 100MB.

Napadlo by nejake vhodne efektivni reseni? Jenom doplnim ze s pythonem vice mene zacinam, ale s timto problemem jsem stravil uz mnoho drahoceneho casu, tak mne to nedalo abych se nezeptal.

Dekuji za odpoved

Pepa H.
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Pavel Stárek avatar 13.4.2007 19:39 Pavel Stárek | skóre: 44 | blog: Tady bloguju já :-) | Kolín
Rozbalit Rozbalit vše Re: Trie v pythonu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Možná by bylo vhodnější ten soubor naimportovat do nějaké databáze - například sqlite. Popisky a návody například http://www.devshed.com/c/a/Python/Using-SQLite-in-Python/ a o samotné sqlite http://www.root.cz/clanky/sqlite-ultra-lehke-sql/ .
Kdo chce, hledá způsob; kdo nechce, hledá důvod.
13.4.2007 21:46 8an | skóre: 30
Rozbalit Rozbalit vše Re: Trie v pythonu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Obávám se že režie Pythonu na objekt a seznamy v něm bude mnohem větší než kolik tím můžeš ušetřit. Trie má smysl pro rychlejší vyhledávání (i když i to je sporné), ne pro úsporu paměti. Pro tohle by se asi hodil indexsekvenční soubor (bloky např. po 4kB, a pamatuješ si interval slov v každém bloku), ale kolik to má jako normální Pythonovský slovník? 100MB paměti dneska nic není...
If you build an operating system that even an idiot can use, only idiots will use it.
14.4.2007 22:35 Tom.š Ze.le.in | skóre: 21 | blog: tz
Rozbalit Rozbalit vše Re: Trie v pythonu
AFAIK trie smysl pro zkompaktnění dat má - viz TAOCP, třetí díl a TeX the Program od par. 919.

Prostorově efektivní implementaci jsem dělal (v jiném jazyce, nevím zda to jde v Pythonu) tak, že jsem alokoval dostatečně velké pole znakú, a s ním pak pracoval přímo pomocí indexu. Tím by se měl minimalizovat overhead jazyka. Po kompaktifikaci lze pole zmenšit na potřebné minimum.

Doporučuji se podívat na ten zdroják TeXu - je to myslím stáhnutelné (tex.web) a docela dokumentované. Tvorba trie tabulky je od par. 942.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.