Подтвердить что ты не робот

Python: Как написать список в файл, а затем вывести его обратно в память (dict, представленный как преобразование строки в dict) позже?

Более конкретный обман 875228-Простое хранение данных в Python.

У меня довольно большой dict (6 ГБ), и мне нужно сделать некоторую обработку на нем. Я пытаюсь использовать несколько методов кластеризации документов, поэтому мне нужно иметь все это в памяти сразу. У меня есть другие функции для запуска этих данных, но содержимое не изменится.

В настоящее время, каждый раз, когда я думаю о новых функциях, мне приходится писать их, а затем повторно генерировать dict. Я ищу способ записать этот файл в файл, так что я могу загрузить его в память, а не перерасчитывать все его значения.

чтобы упростить вещи, это выглядит примерно так:   {(( "слово", "список" ), (1,2), (1,3)), (...)): 0.0,....}

Я чувствую, что у python должен быть лучший способ, чем я зацикливаюсь через какую-то строку, которая ищет: и (пытается разобрать его в словаре.

4b9b3361

Ответ 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 и более быстрого поиска