Фон: я строю три для представления словаря, используя минимальный алгоритм построения. Список ввода представляет собой строки 4.3M utf-8, отсортированные лексикографически. Результирующий граф является ациклическим и имеет максимальную глубину 638 узлов. Первая строка моего сценария устанавливает предел рекурсии 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 раз глубины дерева для некоторого n? Или это может быть вызвано чем-то еще, о чем я не знаю?
Обновление: Установка глубины рекурсии на 3000 не помогла, поэтому этот проспект не выглядит многообещающим.
Обновление 2: Вы, ребята, были правы; Я был близорук в предположении, что рассол будет использовать небольшую глубину вложения из-за ограничений рекурсии по умолчанию. 10000 сделали свое дело.