Python: Как написать список в файл, а затем вывести его обратно в память (dict, представленный как преобразование строки в dict) позже?
Более конкретный обман 875228-Простое хранение данных в Python.
У меня довольно большой dict (6 ГБ), и мне нужно сделать некоторую обработку на нем. Я пытаюсь использовать несколько методов кластеризации документов, поэтому мне нужно иметь все это в памяти сразу. У меня есть другие функции для запуска этих данных, но содержимое не изменится.
В настоящее время, каждый раз, когда я думаю о новых функциях, мне приходится писать их, а затем повторно генерировать dict. Я ищу способ записать этот файл в файл, так что я могу загрузить его в память, а не перерасчитывать все его значения.
чтобы упростить вещи, это выглядит примерно так: {(( "слово", "список" ), (1,2), (1,3)), (...)): 0.0,....}
Я чувствую, что у python должен быть лучший способ, чем я зацикливаюсь через какую-то строку, которая ищет: и (пытается разобрать его в словаре.
Ответы
Ответ 1
Почему бы не использовать python pickle?
Python имеет отличный модуль сериализации, называемый pickle, который очень прост в использовании.
import cPickle
cPickle.dump(obj, open('save.p', 'wb'))
obj = cPickle.load(open('save.p', 'rb'))
Есть два недостатка с рассолом:
- Он не защищен от ошибочных или
вредоносные данные. Никогда
нечеткие данные, полученные от
ненадежный или неаутентифицированный источник.
- Формат не читается человеком.
Если вы используете python 2.6, есть встроенный модуль, называемый json. Это так же просто, как рассол:
import json
encoded = json.dumps(obj)
obj = json.loads(encoded)
Формат Json является читабельным человеком и очень похож на строковое представление словаря в python. И не имеет никаких проблем с безопасностью, таких как рассол. Но может быть медленнее, чем cPickle.
Ответ 2
Я бы использовал shelve
, json
, yaml
или что-то еще, как это было предложено другими ответами.
shelve
особенно круто, потому что вы можете иметь dict
на диске и все еще использовать его. Значения будут загружаться по запросу.
Но если вы действительно хотите разобрать текст dict
, и он содержит только str
ings, int
и tuple
, как вы показали, вы можете использовать ast.literal_eval
, чтобы проанализировать его. Это намного безопаснее, так как вы не можете вычислять с ним полные выражения - он работает только с str
ings, numbers, tuple
s, list
s, dict
s, bool
eans и None
:
>>> import ast
>>> print ast.literal_eval("{12: 'mydict', 14: (1, 2, 3)}")
{12: 'mydict', 14: (1, 2, 3)}
Ответ 3
Я бы предположил, что вы используете YAML для своего формата файла, чтобы вы могли возиться с ним на диске
How does it look:
- It is indent based
- It can represent dictionaries and lists
- It is easy for humans to understand
An example: This block of code is an example of YAML (a dict holding a list and a string)
Full syntax: http://www.yaml.org/refcard.html
Чтобы получить его на python, просто easy_install pyyaml. См. http://pyyaml.org/
Он поставляется с легкими функциями сохранения/загрузки файлов, которые я не могу запомнить в эту минуту.
Ответ 4
Запишите его в сериализованном формате, таком как pickle (стандартный библиотечный модуль python для сериализации) или, возможно, с помощью JSON (который представляет собой представление, которое может быть отображено для получения представления памяти снова).
Ответ 5
Это решение в SourceForge использует только стандартные модули Python:
y_serial.py модуль:: хранилище объектов Python с SQLite
"Сериализация + персистентность:: в нескольких строках кода, сжатие и аннотирование объектов Python в SQLite, а затем их хронологически восстановить по ключевым словам без какого-либо SQL. Самый полезный" стандартный "модуль для базы данных для хранения данных без схемы."
http://yserial.sourceforge.net
Бонус к сжатию, вероятно, уменьшит ваш 6 ГБ словарь до 1 ГБ. Если вы не хотите хранить ряд словарей, модуль также содержит решение file.gz, которое может быть более подходящим с учетом вашего размера словаря.
Ответ 6
Вот несколько альтернатив в зависимости от ваших требований:
-
numpy
хранит ваши простые данные в компактной форме и хорошо выполняет групповые/массовые операции
-
shelve
похож на большой файл с резервной копией файла
-
некоторый сторонний модуль хранения, например. stash
хранит произвольные простые данные
-
надлежащая база данных, например. mongodb для волосатых данных или данных mysql или sqlite plain и более быстрого поиска