Alcanzando la profundidad máxima de recursión usando Pickle / cPickle
El fondo: estoy construyendo un trie para representar un diccionario, usando un algoritmo de construcción mínimo. La lista de entrada es 4.3M cadenas utf-8, ordenadas lexicográficamente. El gráfico resultante es acíclico y tiene una profundidad máxima de 638 nodos. La primera línea de mi script establece el límite de recursión a 1100 a través desys.setrecursionlimit()
.
El problema: me gustaría poder serializar mi trie en el disco, así que puedo cargarlo en la memoria sin tener que reconstruir desde cero (aproximadamente 22 minutos). He intentado tantopickle.dump()
ycPickle.dump()
, con los protocolos tanto de texto como binarios. Cada vez, obtengo un seguimiento de pila que se parece a lo siguiente:
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
Mis estructuras de datos son relativamente simples:trie
contiene una referencia a un estado de inicio y define algunos métodos.dfa_state
contiene un campo booleano, un campo de cadena y una asignación de diccionario de etiqueta a estado.
No estoy muy familiarizado con el funcionamiento interno depickle
- ¿mi profundidad máxima de recursión debe ser mayor / igual n veces la profundidad del trie para n? ¿O podría ser causado por algo más que desconozco?
Actualizar: Establecer la profundidad de recursión en 3000 no ayudó, por lo que esta avenida no parece prometedora.
Actualización 2: Ustedes tenían razón; Estaba siendo miope al suponer que Pickle usaría una pequeña profundidad de anidamiento debido a las limitaciones de recursión predeterminadas. 10.000 hicieron el truco.