Я пытаюсь написать функцию, которая извлекает файл с указанным именем, используя волшебную команду %store.
Например, если я сохранил файл как "df"
, но позже хочу получить его под рамкой имени "«Затем я хочу вызвать функцию, используя retrieve('df','frame')
, после чего переменная рамка будет содержать кадр данных, который ранее был сохранен как df.
Однако я не уверен, как это сделать, функция ниже простовозвращает
«нет сохраненной переменной outputfile»
import IPython
import gc
import os
import numpy as np
import pandas as pd
path = IPython.paths.get_ipython_dir()+'\profile_default\db\\autorestore\\'
для извлечения сохраненного файла (входного файла) под указанным именем (выходной файл)
def retrieve(inputfile,outputfile='temp'):
os.rename(r''+path+inputfile,r''+path+outputfile)
%store -r outputfile
os.rename(r''+path+outputfile,r''+path+inputfile)
return
In [48]: retrieve('df','frame')
returns "no stored variable outputfile"
Более подробная информация по моей причине / background
Основная причина для этого - освободить память.У меня есть некоторые файлы, которые я получаю с помощью %store
, а затем выполняю некоторые манипуляции или объединяюсь в другой dataframe
.После этого я хочу освободить используемую память, но запуск %xdel
для файла, полученного с помощью %store -r
, не освобождает память.
Поэтому я написал ниже функцию, которая извлекает сохраненный файл вимя переменной temp.Затем я могу после этого освободить память, получив пустой файл как temp.
#function to retrieved a stored file (inputfile) unde the variable name temp
def retrieve_temp(inputfile):
os.rename(r''+path+inputfile,r''+path+'temp')
%store -r temp
os.rename(r''+path+'temp',r''+path+inputfile)
return
, поэтому, например, перед тем, как извлечь что-либо, текущее использование оперативной памяти составляет
In [5]: ram_usage()
Out[5]: '107mb'
Затем я извлекаю файл и смотрюпри новом использовании оперативной памяти
In[6]: (retrieve_temp('comps'),ram_usage())[1]
Out[6]: '2520mb'
После запуска% xdel использование остается прежним
In[12]: %xdel temp
In[13]: ram_usage()
Out[13]: '2520mb'
После извлечения пустого файла с именем «temp» оперативная память освобождается
In [14]: (retrieve_temp('b'),ram_usage())[1]
Out [14]: '114mb'
Это решает большинство проблем с памятью, однако иногда мне нужно работать над несколькими кадрами одновременно.
Поэтому я хочу иметь более общую функцию, в которой я могу указатьимя используется для временного кадра и легко освободить память позже.Это также поможет сделать мой код более читабельным, используя более описательные имена для временных кадров данных.
Я хотел бы знать, есть ли способ заставить работать мою первую функцию (не обязательно с помощью магии %store
, но я не хочу самому выбирать файлы)
В качестве альтернативы, пожалуйста, дайте мне знать, если есть другой способ освободить память, используемую переменной, которая извлекается с помощью команды% store magic.(Я пытался %xdel, del, %reset, gc.collect(),
запустить sub-processes
, который не сработал слишком хорошо, пока единственный способ, которым это работает, - сбросить ядро или получить пустой файл с тем же именем)
Многиеспасибо,