Варианты рассола

Я пытаюсь сериализовать большой (~ 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

Ответ 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 кажется перспективным и правильно разработанным, но пока не популярным решением.