Фон: Я создаю trie для представления словаря, используя минимальный алгоритм построения. Список входных данных - это строки 4.3M utf-8, отсортированные лексикографически. Полученный граф ацикличен и имеет максимальную глубину 638 узлов. Первая строка моего скрипта устанавливает предел рекурсии на 1100 через sys.setrecursionlimit()
.Достижение максимальной глубины рекурсии с использованием Pickle/cPickle
Проблема: Я хочу, чтобы иметь возможность сериализовать мой 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 сделали трюк.
Я обнаружил, что увеличение предела рекурсии оказывает сильное влияние на использование памяти ... – fccoelho
http://svn.python.org/projects/python/trunk/Tools/scripts/find_recursionlimit.py может помочь вам найти верхнюю предел вашего оборудования – Ullullu