Lo sfondo: sto costruendo un trie per rappresentare un dizionario, utilizzando un algoritmo di costruzione minimo. L'elenco di input è 4,3 M corde utf-8, ordinate lessicograficamente. Il grafico risultante è aciclico e ha una profondità massima di 638 nodi. La prima riga del mio script imposta il limite di ricorsione su 1100 tramite sys.setrecursionlimit()
.Massima profondità di ricorsione mediante Pickle/cPickle
Il problema: mi piacerebbe essere in grado di serializzare il mio trie su disco, così posso caricarlo in memoria senza dover ricostruire da zero (circa 22 minuti). Ho provato sia pickle.dump()
e cPickle.dump()
, con entrambi i protocolli di testo e binari. Ogni volta, ottengo uno stack-traccia che è simile al seguente:
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 649, in save_dict
self._batch_setitems(obj.iteritems())
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 663, in _batch_setitems
save(v)
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 725, in save_inst
save(stuff)
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 648, in save_dict
self.memoize(obj)
RuntimeError: maximum recursion depth exceeded
mie strutture di dati sono relativamente semplici: trie
contiene un riferimento a uno stato di avvio, e definisce alcuni metodi. dfa_state
contiene un campo booleano, un campo stringa e un dizionario che esegue il mapping dall'etichetta allo stato.
Non ho molta familiarità con il funzionamento interno di pickle
- la mia profondità massima di ricorsione deve essere maggiore/uguale n volte la profondità del trie per alcuni n? O potrebbe essere causato da qualcos'altro di cui non sono a conoscenza?
Aggiornamento: L'impostazione della profondità di ricorsione a 3000 non ha aiutato, quindi questa strada non sembra promettente.
Aggiornamento 2: Voi ragazzi avete ragione; Ero miope nell'assumere che il pickle usasse una piccola profondità di annidamento a causa dei limiti di ricorsione predefiniti. 10.000 hanno fatto il trucco.
Ho riscontrato che l'aumento del limite di ricorsione ha un forte impatto sull'utilizzo della memoria ... – fccoelho
http://svn.python.org/projects/python/trunk/Tools/scripts/find_recursionlimit.py può aiutarti a trovare la parte superiore limite dell'hardware – Ullullu