Как сохранить объект в памяти компьютера

Обновлено: 28.06.2024

Инженер-технолог @similarweb

Кориджо

Присоединился 5 авг. 2013 г.

миколайпабищак

838239178

рыбная банка

Чунхва Телеком Ко., Лтд.

леоандреа7

Присоединился 4 марта 2016 г.

снайпер-хх

Присоединился 5 апреля 2009 г.

гравитивп

отлично

Информационный центр компьютерных сетей Академии наук Китая

низкий

Прогян1997

@ИнтервьюКикстарт | Ранее @interviewstreet

jackhe16

тшрадхея

@agoda-com ex-@visa, ex-@giddyinc

Присоединился 19 апреля 2018 г.

Данье-Эвенс

фбраза

скворн

Присоединился 8 ноября 2014 г.

конг78

тспэнхв

добавить ссылку

KinXdle

Присоединился 5 ноября 2015 г.

jason97955

Присоединился 4 июня 2018 г.

мклиншеперд

Присоединился 3 мая 2010 г.

ФелдринХ

Присоединился 18 августа 2013 г.

эйнато

Присоединился 27 апреля 2021 г.

станжай

Хайчжи Холдинг Инк.

Присоединился 6 марта 2013 г.

zhxzhx12

Присоединился 21 апреля 2017 г.

лукасжанусик

валтаб

Присоединился 25 сентября 2018 г.

jblumere

Присоединился 7 июня 2021 г.

лежачий жук

Присоединился 1 марта 2015 г.

Мурат Гундес

вегетарианец

специальный райджин

Томасф

yanadior9029

Присоединился 16 мая 2021 г.

Эмиль Лаурсен

Присоединился 22 августа 2014 г.

маринча

картсет

карантин2020

Присоединился 20 февраля 2015 г.

Фредхен2022

Присоединился 16 сентября 2021 г.

fгравий

Присоединился 15 марта 2014 г.

Роббимило

инициальный_дискретный_код

Эдеркногейра

Присоединился 27 июля 2021 г.

непреклонный

Присоединился 2 ноября 2021 г.

панжц

Вы не можете выполнить это действие в данный момент.

Вы вошли в другую вкладку или окно. Перезагрузите, чтобы обновить сеанс. Вы вышли на другой вкладке или в другом окне. Перезагрузите, чтобы обновить сеанс.

@MartinThoma: Почему вы (кажется) предпочитаете этот ответ принятому (связанного вопроса)?

В то время, когда я делал ссылку, в принятом ответе не было протокола=pickle.HIGHEST_PROTOCOL . Мой ответ также дает альтернативы рассолу.

5 ответов 5

Вы можете использовать модуль pickle из стандартной библиотеки. Вот элементарное применение этого к вашему примеру:

Вы также можете определить свою собственную простую утилиту, например следующую, которая открывает файл и записывает в него один объект:

Обновить

Поскольку это такой популярный ответ, я хотел бы затронуть несколько более сложных тем использования.

cPickle (или _pickle ) против рассола

Почти всегда предпочтительнее использовать модуль cPickle, а не pickle, потому что первый написан на C и намного быстрее. Между ними есть некоторые незначительные различия, но в большинстве ситуаций они эквивалентны, и версия C обеспечивает гораздо более высокую производительность. Переключиться на него проще простого, просто измените оператор импорта на это:

В Python 3 cPickle был переименован в _pickle , но в этом больше нет необходимости, так как модуль pickle теперь делает это автоматически — см. В чем разница между pickle и _pickle в Python 3?.

Вы можете использовать что-то вроде следующего, чтобы ваш код всегда использовал версию C, когда она доступна как в Python 2, так и в Python 3:

Форматы потоков данных (протоколы)

pickle может читать и записывать файлы в нескольких различных, характерных для Python форматах, называемых протоколами, как описано в документации. «Протокол версии 0» представляет собой ASCII и, следовательно, «удобен для чтения человеком». Версии > 0 являются двоичными, а самая высокая доступная версия зависит от используемой версии Python. Значение по умолчанию также зависит от версии Python. В Python 2 по умолчанию была версия протокола 0, но в Python 3.8.1 это версия протокола 4. В Python 3.x к модулю был добавлен pickle.DEFAULT_PROTOCOL, но его нет в Python 2.

К счастью, есть сокращение для записи pickle.HIGHEST_PROTOCOL в каждом вызове (при условии, что вы этого хотите и обычно делаете), просто используйте буквальное число -1 — аналогично ссылке на последний элемент последовательности через отрицательный индекс. Итак, вместо того, чтобы писать:

Вы можете просто написать:

В любом случае вам нужно будет указать протокол только один раз, если вы создали объект Pickler для использования в нескольких операциях pickle:

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

Несколько объектов

Несмотря на то, что файл pickle может содержать любое количество объектов pickle, как показано в приведенных выше примерах, когда их неизвестное количество, часто бывает проще хранить их все в какой-то переменной. контейнер размера, например list , tuple или dict, и записать их все в файл одним вызовом:

и восстановить список и все в нем позже с помощью:

Главное преимущество заключается в том, что вам не нужно знать, сколько экземпляров объекта сохранено, чтобы загрузить их позже (хотя сделать это без этой информации можно, для этого потребуется немного специализированный код ). См. ответы на соответствующий вопрос Сохранение и загрузка нескольких объектов в файле рассола? для получения подробной информации о различных способах сделать это. Лично мне больше всего понравился ответ @Lutz Prechelt, так что этот подход используется в приведенном ниже примере кода:

Два ряда солений

Альберт Лукашевски, доктор философии, опытный программист, инженер-программист и писатель, специализирующийся на языке Python.

Pickle, который по умолчанию является частью библиотеки Python, является важным модулем, когда вам требуется постоянство между сеансами пользователя. Как модуль, pickle обеспечивает сохранение объектов Python между процессами.

Программируете ли вы базу данных, игру, форум или какое-либо другое приложение, которое должно сохранять информацию между сеансами, pickle полезен для сохранения идентификаторов и настроек. Модуль pickle может хранить такие вещи, как типы данных, такие как логические значения, строки и массивы байтов, списки, словари, функции и многое другое.

Примечание. Концепция травления также известна как сериализация, маршалинг и сведение. Однако суть всегда одна и та же — сохранить объект в файл для последующего извлечения. При травлении объект записывается как один длинный поток байтов.

Пример кода Pickle на Python

Чтобы записать объект в файл, используйте код со следующим синтаксисом:

Вот как выглядит реальный пример:

Этот фрагмент записывает содержимое object_pi в файл handler file_pi, который, в свою очередь, связан с файлом filename_pi.obj в каталог исполнения.

Чтобы восстановить значение объекта в памяти, загрузите объект из файла. Предполагая, что рассол еще не был импортирован для использования, начните с его импорта:

Следующий код восстанавливает значение числа пи:

После этого объект снова готов к использованию, на этот раз как object_pi2. Вы можете, конечно, повторно использовать исходные имена, если хотите. В этом примере для ясности используются разные имена.

Что нужно помнить о рассоле

Помните следующее при использовании модуля pickle:

  • Протокол pickle специфичен для Python — его совместимость с разными языками не гарантируется. Скорее всего, вы не сможете перенести информацию, чтобы сделать ее полезной в Perl, PHP, Java или других языках.
  • Также нет гарантии совместимости между различными версиями Python. Несовместимость возникает из-за того, что модуль может сериализовать не каждую структуру данных Python.
  • По умолчанию используется последняя версия протокола pickle. Он останется таким, если вы не измените его вручную.

Совет. Также узнайте, как использовать полку для сохранения объектов в Python, чтобы получить еще один метод сохранения целостности объектов.

Сохранение/перемещение объектов и пакетов R

Если вы часто пользуетесь R, вы можете обнаружить, что хотите получить какой-то объект, созданный в R, и переместить его на другой компьютер, чтобы работать с ним. Или, возможно, у вас закончилось место в вашей учетной записи Стэнфорда, и вам нужно удалить свои объекты R, но вы хотели бы сохранить некоторые из них отдельно и заархивировать их. В этом руководстве приведены некоторые полезные команды для работы с объектами R. Однако это предназначено для манипулирования объектами R, которые предназначены для чтения и обработки в R. Это не то, как вы будете экспортировать data.frame, чтобы вы могли дать его кому-то для чтения, например, в виде электронной таблицы (для которой вы бы хотели, возможно, write.table)

Предупреждение. Многие части этого могут относиться к Windows.

    Каталоги и работа с файлами в R

Если вы просто дважды щелкаете на рабочем столе, вы, вероятно, не знаете, какой каталог вы используете — R запускается в каталоге по умолчанию. Вы можете узнать, в каком каталоге вы находитесь, с помощью команды getwd():

Обратите внимание, что R использует "/" для разделения каталогов (например, unix), а не " " в Windows. Если вы вводите путь к каталогу, вы можете использовать " " или "/", но не Windows " ".

Если вы хотите изменить каталоги, вы можете использовать команду setwd() или, если вы находитесь в графическом интерфейсе Windows, перейдите в «Файл», а затем нажмите «Изменить каталог»

В R есть много команд, которые позволяют вам перемещаться по файлам и каталогам, как в Unix, только команды, как правило, НЕ одинаковы. Вот некоторый перевод (команды Unix не всегда полностью эквивалентны, поэтому вам следует обратиться к справке по R):

R Описание Unix
list.files/dir Список файлов в заданном каталоге ls
dir.create Создает новый каталог mkdir
удалить ссылку Удаляет файл или каталог rm
setwd Изменить рабочий каталог cd
getwd Печать рабочего каталога pwd

Специфично для R
file.remove file.create file.exists
file.rename< /TD> file.append file.copy

Если вы часто используете R, вы можете обнаружить, что для некоторых проектов или классов вы хотели бы, чтобы ваши объекты для этого проекта/класса были доступны в отдельных папках. Например, вы можете захотеть запомнить, для чего предназначались эти данные xinc, прежде чем удалить их, или чтобы у вас не было проблем с памятью, особенно если вы работаете вне Leland и, таким образом, может не хватить места.

Однако это легче объяснить, если мы сначала узнаем о сохранении объектов.

    Сохранение определенного объекта

Если вы хотите сохранить созданный вами конкретный объект (например, набор данных) для последующего использования в R, вы можете использовать команду save . Если вы сделаете расширение вашего файла «.rdata», тогда Windows распознает его как файл данных R и «откроет» его в R, автоматически запустив R и сделав объекты, сохраненные в файлах, доступными объектами в R.

Если вы выйдете из R и просмотрите файлы в своем рабочем каталоге, вы увидите Numb.Rdata. (Если вы не можете найти, где он сохранен, то вы, вероятно, просто не знаете свой рабочий каталог - используйте getwd() выше, чтобы узнать). Теперь это файл, который вы можете перемещать в разные каталоги, отправлять по электронной почте и т. д., как и любой другой файл на вашем компьютере — это способ сохранения вашей информации. (dump() — это другой способ, но не такой удобный и занимающий больше места). Если вы переместите его, скажем, на другой компьютер, вы можете вернуть его в R с помощью load()

Вы можете сохранить более 1 объекта в файл, указав вектор имен символов объектов, используя список опций. Например, если бы я создал два объекта с именами temp и temp2 , я мог бы выполнить любую из следующих команд

    Для любого большого проекта вы должны хранить отдельный текстовый файл с вашими командами в текстовом редакторе, таком как Блокнот. Если вы используете такие программы, как XEmacs или RWinEdt, вы можете отправлять команды из текстового файла в R с помощью клавиатуры, а не переключаться между окнами и копировать и вставлять. Если у вас есть функция, и вы сохраняете ее в отдельном файле, скажем, «myfun.R», вам не нужно вырезать и вставлять все это в R. Вы можете использовать источник функции, чтобы R прочитал файл.< /p>

Преимущество заключается в том, что R сообщит вам о наличии синтаксической ошибки и номере строки, если вы используете источник .

Обратите внимание, что история не содержит выходных данных и знака подсказки (">"), поэтому вы можете копировать и вставлять прямо из истории в консоль.

См. пояснение в конце моего руководства Introduction to R Lab (прокрутите вниз до раздела Графики)

Конечно, если вы сохраняете в диалоговом окне при выходе из R, вам не нужно загружать информацию обратно, потому что объект "Numb" и любые другие созданные вами объекты сохраняются. За исключением каких-либо сюжетов, все как будто вы только что покинули его. Иногда вам нужно сделать резервную копию всего сеанса в середине, на случай, если что-то выйдет из строя и т. д.

На самом деле, когда вы сохраняете при выходе, R фактически вызывает функцию save.image , которая сохраняет все объекты в файл «.RData» в вашем рабочем каталоге. Таким образом, вы можете получить доступ ко всем своим данным, которые вы сохранили при выходе, загрузив файл .RData. Таким образом, вы также можете вызвать save.image() в середине сеанса, чтобы сохранить все в файл .RData в вашем рабочем каталоге, а не ждать до конца.

Однако, если вы вызовете save.image отдельно, история команд не будет сохранена. Если вы сохраняете в приглашении, R также вызывает savehistory() для сохранения команд, и каждый раз, когда вы запускаете R, R открывает файл «.Rhistory», если он существует, и делает найденные там команды вашей текущей историей. Если вы действительно хотите сделать резервную копию всего, убедитесь, что вы также вызываете savehistory()

загрузить(), сохранить.image(), setwd(), savehistory(), loadhistory(), source() также можно вызывать из графического интерфейса R в разделе "Файл".

Часто полезно иметь разные сеансы R для разных проектов или классов. Под этим я подразумеваю разные рабочие каталоги с соответствующими файлами «.RData». Одним из преимуществ этого, например, является то, что когда вы вводите ls() , вы видите только объекты в этом файле «.RData», поэтому у вас есть объекты только для этого проекта. Точно так же, если вы сохраните график или объект, они по умолчанию будут находиться в этом каталоге. Это помогает разделить ваши проекты, а также помогает случайно не использовать неправильные данные или функцию!

Если вы работаете с Leland или, как правило, с Unix-машиной, при вводе "R" автоматически предполагается, что рабочий каталог находится там, где при сохранении и выходе создается файл ".RData". . Итак, если вы находитесь в папке «stat» для своего класса, если вы наберете «R» в командной строке, объекты будут там.

<ПР>
  • Скопируйте существующий ярлык R и назовите его, например, "Bio144 R".
  • Для этого ярлыка щелкните правой кнопкой мыши значок и выберите свойства.
  • Измените каталог "Начать в" на тот, который вам нравится"
  • В противном случае, если у вас есть Robject, сохраненный как файл «xxx.rdata» (см. ниже), то двойной щелчок по этому файлу откроет R с рабочим каталогом, в котором находился файл. Это включает в себя файл «.Rdata», который R генерирует при сохранении при выходе. Поэтому, если вам не нужен ярлык для каждой папки, вы можете в качестве альтернативы:

    <ПР>
  • Создайте небольшой объект R ( temp – константа или вектор) в стандартном R, который вы получаете, нажав на ярлык на рабочем столе.
  • Сохраните его как "start.rdata" (см. выше) и закройте R
  • Переместите этот файл в нужную папку, скажем, "Project1" в разделе "Мои документы".
  • Дважды щелкните "start.rdata". Это должно запустить R с рабочим каталогом в папке "Project1".
  • Сохраните рабочую область с помощью графического интерфейса или save.image, чтобы создать файл «.RData» в папке «Project1». Вы также можете просто не забыть сохранить, когда появится запрос при выходе.
  • Это довольно просто и в основном применимо к пользователям графического интерфейса Windows. Библиотеки — это дополнительные функции, доступные в R, обычно более специализированные. Если библиотека уже есть на вашем компьютере (т. е. это одна из стандартных библиотек, включенных в R, или вы ее загрузили), вы можете просто ввести:

    Это открывает библиотеку, чтобы вы могли получить доступ к ее функциям. Узнать, что входит в комплект, можно с помощью:

    На персональном компьютере (Windows) - на примере пакета ISwR:

    <ПР>

  • Нажмите "Пакеты" и прокрутите вниз до "Установить пакеты из CRAN".
  • В новом окне должен появиться список возможных пакетов для установки. Прокрутите вниз и нажмите "ISwR"
  • R должен приступить к установке пакета. На вопрос «Удалить загруженные файлы (да/нет)?» введите "у".
  • Чтобы открыть библиотеку, введите:

    Вы также можете сделать все это из командной строки с помощью таких команд, как download.packages и install.packages и т. д., как это немного сделано в разделе «Устранение неполадок» ниже. Как правило, загрузка пакета вручную путем перехода в браузере на страницу CRAN, его загрузка и установка из загруженного файла может быть сложной задачей в Windows, поскольку он не будет правильно собран или не будет иметь правильного zip-файла и т. д. Используйте эквивалентные команды, предоставленные R, если это вообще возможно.

    • Если вы работаете на сетевом компьютере, у вас нет прав для установки нового пакета. Вместо этого вы можете устанавливать пакеты локально в «Мои документы» или в любую другую папку, в которую у вас есть права записи. (Я буду называть это «Мои документы» ниже с пользовательской папкой «joesmith», но просто замените ваши спецификации)
    • Создайте папку "RLib" в папке "Мои документы" для хранения своих библиотек.
    • В R установите библиотеки с помощью следующей команды:

    Читайте также: