Как распиливать словарь python в MySQL?

Я просмотрел несколько SO-Вопросов о том, как распиливать объект python и хранить его в базе данных. Собранная мной информация:

  • import pickle или import cpickle . Импортируйте последнее, если производительность является проблемой.
  • Предположим, что dict – это словарь python (или какой-либо объект python): pickled = pickle.dumps(dict) .
  • магазин, pickled в колонку BLOB MySQL, используя тот самый модуль, который связывается с базой данных.
  • Получите это снова. И используйте pickle.loads(pickled) чтобы восстановить словарь python.

Я просто хочу убедиться, что понял это правильно. Я пропустил что-то критическое? Есть побочные эффекты? Неужели это так просто?

Фоновая информация: Единственное, что я хочу сделать, это хранить Googlegeocoder-Responses, которые являются вложенными словарями python в моем случае. Я использую только небольшую часть объекта ответа, и я не знаю, буду ли я когда-нибудь в этом нуждаться. Вот почему я думал о сохранении ответа, чтобы сохранить повторение нескольких миллионов запросов.

3 Solutions collect form web for “Как распиливать словарь python в MySQL?”

Это действительно так просто … пока вам не нужна ваша БД, чтобы знать что-нибудь о словаре. Если вам нужен какой-либо структурированный доступ к содержимому словаря, тогда вам нужно будет более активно участвовать.

Другой способ получить может быть то, что вы намерены ввести в dict. Сериализация Pileon's pickle довольно интеллектуальна и может обрабатывать большинство случаев без необходимости добавления пользовательской поддержки. Однако, когда это не сработает, может быть очень сложно понять, что пошло не так. Поэтому, если можно, ограничьте содержимое dict на встроенные типы Python. Если вы начинаете добавлять экземпляры пользовательских классов, держите их в простых пользовательских классах, которые не делают каких-либо забавных вещей с хранилищем атрибутов или доступом. И будьте осторожны с добавлением экземпляров классов или типов из надстроек. В общем, если вы начинаете сталкиваться с трудными для понимания проблемами с травлением или распиловкой, посмотрите на нестрочные типы в dict.

Если скорость действительно важна, я просто проверил тест по загрузке большого словаря python (35 МБ) из pickle vs SELECTING из таблицы MySql со всеми ключами и значениями, хранящимися в строках:

Метод рассола:

 import time, pickle t1 = time.clock() f = open('story_data.pickle','rb') s = pickle.load(f) print time.clock() - t1 

Метод MySQL:

 import database as db t1 = time.clock() data,msg = db.mysql(""" SELECT id,story from story_data;""") data_dict = dict([(int(x),y.split(',')) for x,y in data]) print time.clock() - t1 

Выход: метод рассола: 32.0785171704 Метод mysql: 3.25916336479

Если десятикратного увеличения скорости достаточно, структура базы данных, вероятно, не имеет значения. Примечание. Я разделяю все данные, разделенные запятыми, на списки как значения для 36 000 ключей, и это занимает всего 3 секунды. Поэтому я отказался от использования соленья для больших наборов данных, так как оставшаяся часть 400-ти линейной программы, которую я использовал, заняла около 3 секунд, а загрузка солености заняла 32 секунды.

Также обратите внимание:

cPickle работает так же, как маринованный, и на 50% быстрее.

Не пытайтесь рассортировать класс, полный словарей, и сохранять в mysql: он не восстанавливается правильно, по крайней мере, это не для меня.

Если у вас есть вложенные словари, вы должны быть осторожны. Большинство объектов python не расклиниваются (и вы можете набить любой объект как значение в dict ). Хуже того, еще меньше объектов python могут быть преобразованы в строки и сохранены в SQL.

Однако, если вы используете klepto , сериализация и хранение в базе данных довольно прозрачны и работают для большинства объектов python.

Давайте построим некоторые типичные объекты python в dict (или dicts):

 >>> class Foo(object): ... def bar(self, x): ... return self.y + x ... y = 1 ... >>> d1 = {'a': min, 'b': lambda x:x**2, 'c': [1,2,3], 'd': Foo()} >>> f = Foo(); fy = 100 >>> d2 = {'a': max, 'b': lambda x:x**3, 'c': [2,1,3], 'd': f} 

Теперь давайте dict вложенный dict и дамп в архив MYSQL.

 >>> import klepto >>> a = klepto.archives.sql_archive('mysql://user:pass@localhost/foo', dict={'d1':d1, 'd2':d2}) >>> a.dump() 

Теперь мы удаляем наш интерфейс в архив … и создаем новый. load загружает все объекты в память.

 >>> del a >>> b = klepto.archives.sql_archive('mysql://user:pass@localhost/foo') >>> b.load() 

Теперь мы получаем доступ к объектам в копиях в памяти.

 >>> b['d1'] {'a': <built-in function min>, 'c': [1, 2, 3], 'b': <function <lambda> at 0x1037ccd70>, 'd': <__main__.Foo object at 0x103938ed0>} >>> b['d1']['b'](b['d1']['d'].bar(1)) 4 >>> b['d2']['b'](b['d2']['d'].bar(1)) 1030301 >>> 

Мы выходим из python … и затем запускаем новый сеанс. На этот раз мы решили использовать cached=False , поэтому мы будем напрямую взаимодействовать с базой данных.

 dude@hilbert>$ python Python 2.7.10 (default, May 25 2015, 13:16:30) [GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import klepto >>> b = klepto.archives.sql_archive('mysql://user:pass@localhost/foo', cached=False) >>> b['d2']['b'](b['d2']['d'].bar(1)) 1030301 >>> b['d1']['b'](b['d1']['d'].bar(1)) 4 >>> 

klepto использует klepto , поэтому он работает через несколько бэкендов базы данных … и, кроме того, предоставляет один и тот же интерфейс для хранения на диске (в файле или каталоге).

  • pickle.load () повышение EOFError в Windows
  • Django mod_wsgi PicklingError при сохранении объекта
  • Как исправить эту ошибку unicode / cPickle в Python?
  • Самый быстрый способ сохранить и загрузить большой словарь в Python
  • Как сохранить экземпляр объекта libSVM python?
  • Словарь переменных класса не сохраняется с помощью pickle.dump в python 2.7
  • Травление переименования, выставленное Boost.Python
  • Pickle не может хранить объект в кэше логарифма django во время тестов?
  • Как рассортировать дистрибутив scipy.stats (не может сортировать объекты instancemethod)
  • Как правильно сортировать экземпляр namedtuple
  • Как раскрыть объект ssl.SSLContext
  • Python - лучший язык программирования в мире.