Фон: я создаю trie для представления словаря, используя минимальный алгоритм построения. Список входных данных - это строки 4.3M utf-8, отсортированные лексикографически. Полученный граф ацикличен и имеет максимальную глубину 638 узлов. Первая строка моего script устанавливает предел рекурсии в 1100 через sys.setrecursionlimit()
.
Проблема: я хочу, чтобы иметь возможность сериализовать мой trie на диск, поэтому я могу загрузить его в память, не перестраивая с нуля (примерно 22 минуты). Я пробовал как pickle.dump()
, так и cPickle.dump()
, как с текстовыми, так и с бинарными протоколами. Каждый раз я получаю трассировку стека, которая выглядит следующим образом:
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
Мои структуры данных относительно просты: trie
содержит ссылку на начальное состояние и определяет некоторые методы. dfa_state
содержит логическое поле, поле строки и сопоставление словаря от метки к состоянию.
Я не очень хорошо знаком с внутренними работами pickle
- моя максимальная глубина рекурсии должна быть больше/равна n раз больше глубины trie для некоторого n? Или это может быть вызвано чем-то другим, о котором я не знаю?
Обновление: Установка глубины рекурсии на 3000 не помогла, поэтому этот проспект не выглядит многообещающим.
Обновление 2: Вы, ребята, были правы; Я был близоруким, полагая, что рассол будет использовать небольшую глубину вложенности из-за ограничений рекурсии по умолчанию. 10 000 сделали трюк.