Ipython использует% store magic для получения динамического имени - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь написать функцию, которая извлекает файл с указанным именем, используя волшебную команду %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, который не сработал слишком хорошо, пока единственный способ, которым это работает, - сбросить ядро ​​или получить пустой файл с тем же именем)

Многиеспасибо,

1 Ответ

0 голосов
/ 24 мая 2018

После еще нескольких копаний я нашел функцию, которая вызывает магическую команду, и использовал ее.get_ipython().run_line_magic('store', '-r '+outputfile)

Ниже приведена измененная функция (обратите внимание, что если вы используете ее, вы можете захотеть сделать ее более надежной, например, добавив несколько строк, которые временно переименовывают любой файл, который вы уже сохранили под именем «outputfile»")

import IPython
import os
import gc
#function to retrieve a stored file (inputfile) under a specified name (outputfile)
def retrieve(inputfile,outputfile='temp'):
    path = IPython.paths.get_ipython_dir()+'\profile_default\db\\autorestore\\'
    os.rename(r''+path+inputfile,r''+path+outputfile)
    get_ipython().run_line_magic('store', '-r '+outputfile)
    os.rename(r''+path+outputfile,r''+path+inputfile)
    gc.collect() #needed to free memory after returning an empty file
    return

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

Использование нового ОЗУ:

Короткая версия заключается в том, что после того, как вы покончили с переменной, именуемой df_temp, вы запускаете retrieve('emptyfile','df_temp') и до тех пор, пока вы не напечатали никакого результатав ячейку ваша память теперь должна быть очищена

In [14]: ram_usage()
Out [14]: '101mb'
In [15]: retrieve('SFBkgs - Copy','df_temp')
In [16]: ram_usage()
Out [16]: '1281mb'
In [17]: df_temp.head(); #if I don't use ; to stop the printing of the output the below still fails to free the ram
In [18]: %xdel df_temp #this still doesn't free the ram
In [19]: ram_usage()
Out [19]: '1281mb'
In [20]: gc.collect()
Out [20]: 7
In [21]: ram_usage() #the garbage collector didn't help
Out [21]: '1281mb'
In [22]: retrieve('emptyfile','df_temp') #retrieves an empty file as df_temp
In [23]: ram_usage() #the memory has now been freed
Out [23]: '103mb'
...