Варианты рассола
Я пытаюсь сериализовать большой (~ 10 ** 6 рядов, каждый с ~ 20 значениями) список, который позже будет использоваться мной (так что отсутствие безопасности не является проблемой).
Каждая строка списка представляет собой набор значений, полученных из некоторой базы данных SQL. До сих пор я видел datetime.datetime
, строки, целые числа и NoneType, но в конечном итоге мне, возможно, придется поддерживать дополнительные типы данных.
Для сериализации я рассмотрел pickle (cPickle), json и обычный текст - но только pickle сохраняет информацию о типе: json не может сериализовать datetime.datetime
, а простой текст имеет свои очевидные недостатки.
Однако cPickle довольно медленно обрабатывает такие большие данные, и я ищу более быструю альтернативу.
Ответы
Ответ 1
Я думаю, вы должны дать PyTables внешний вид. Это должно быть смехотворно быстро, по крайней мере, быстрее, чем при использовании РСУБД, поскольку оно очень слабое и не накладывает ограничений на чтение/запись, плюс вы получаете лучший интерфейс для управления вашими данными, по крайней мере, по сравнению с травлением.
Ответ 2
Pickle на самом деле довольно быстро, пока вы не используете (по умолчанию) ASCII-протокол. Просто убедитесь, что вы сбрасываете с помощью protocol=pickle.HIGHEST_PROTOCOL
.
Ответ 3
Протоколные буферы - это гибкий, эффективный, автоматизированный механизм для сериализации структурированных данных - представьте XML, но меньше, быстрее и проще.
преимущества перед XML:
- проще
- в 3-10 раз меньше
- в 20-100 раз быстрее
- менее двусмысленны
- генерировать классы доступа к данным, которые проще использовать программно
https://developers.google.com/protocol-buffers/docs/pythontutorial
Ответ 4
Ответ 5
Для сотен тысяч простых (до JSON-совместимых) объектов Python сложности я нашел наилучшую комбинацию простоты, скорости и размера, объединив:
Он превосходит опции pickle
и cPickle
на порядки.
with gzip.open(filename, 'wb') as f:
ubjson.dump(items, f)
with gzip.open(filename, 'rb') as f:
return ubjson.load(f)
Ответ 6
Я обычно сериализуюсь в обычный текст (*.csv), потому что нашел его самым быстрым. Модуль csv работает достаточно хорошо. См. http://docs.python.org/library/csv.html
Если вам нужно иметь дело с unicode для ваших строк, ознакомьтесь с примерами UnicodeReader и UnicodeWriter в конце.
Если вы сериализуете для своего будущего использования, я думаю, было бы достаточно знать, что у вас одинаковый тип данных для столбца csv (например, строка всегда находится в столбце 2).
Ответ 7
Avro кажется перспективным и правильно разработанным, но пока не популярным решением.
Ответ 8
Просто для полноты - есть также библиотека dill
которая расширяет pickle
.
Как укроп (мариновать) в файл?