μλ λͺ¨λλ€
λ¬Έμ λ₯Ό λ°κ²¬νμ΅λλ€. μ½λλ₯Ό μ€ννκ³ λ©λͺ¨λ¦¬λ₯Ό μ΄ν΄λ³΄μΈμ. κ·Έλ° λ€μ "% matplotlib inline"μ μμ νκ³ λ€μ μμνμμμ€.
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.ticker
%matplotlib inline
import os
import sys
import StringIO
import urllib, base64
from matplotlib import rcParams
rcParams['figure.figsize'] = (24, 6)
rcParams['figure.dpi'] = 150
OUTPUT_FILENAME = "Asd"
def printHTML(html):
with open(OUTPUT_FILENAME, "a") as outputFile: outputFile.write(html if type(html) == str else html.encode('utf8') )
def friendlyPlot():
figure = plt.Figure()
ax = plt.subplot2grid((1,2), (0,0))
ax.plot( range(1000), range(1000) )
#plt.show()
fig = plt.gcf()
imgdata = StringIO.StringIO()
fig.savefig(imgdata, format='png')
imgdata.seek(0) # rewind the data
image = imgdata.buf.encode('base64').replace('\n', '')
printHTML('<img src="data:image/png;base64,{0}" /><br />'.format(image))
plt.close('all')
imgdata.close()
open(OUTPUT_FILENAME, 'w').close()
for i in range(500):
friendlyPlot()
μ΄ λ²κ·Έλ λ°μνμ΅λλ€. λ©λͺ¨λ¦¬ λμμμ΄ μΈλΌμΈ νλ‘―μ μ»μ μμλ λ°©λ²μ΄ μμ΅λκΉ? λ°°μ΄μ΄ μλΉν ν¬κΈ° λλ¬Έμ κ° νλ‘―μ λν΄ λ³λμ νλ‘μΈμ€λ₯Ό μμνκ³ μΆμ§ μμ΅λλ€.
λ©λͺ¨λ¦¬ μ¬μ©λμ΄ μ¦κ°νλ©΄μ΄λ₯Ό νμΈν μ μμ΅λλ€.
len(IPython.kernel.zmq.pylab.backend_inline.show._to_draw)
κ·Έκ²μ μμΉκ° μ μ₯λλ λͺ©λ‘μ λλ€. μΌμμ μΌλ‘ λ§ μμ΄μΌνμ§λ§ μ 리λμ§ μκ³ μμ΄κ³ μμ μλ μμ΅λλ€.
len (IPython.kernel.zmq.pylab.backend_inline.show._to_draw) = 0
BTW, pandas λ°μ΄ν° νλ μμμ .plot()
λ©μλλ₯Ό μ¬μ©νμ¬ νλ‘ν
νκ³ μμ΅λλ€.
μ’μ, κ·Έ μ΄λ‘ μ λ무 λ§μ΄.
ν¬λκ° λ΄λΆμ μΌλ‘λ νλ‘― μ£Όλ³μ μΌλΆ λ°μ΄ν°λ₯Ό 보κ΄ν μ μμ΅λλ€. νμ§λ§ μλ λ³΄κ³ μμλ νλ€κ° ν¬ν¨λμ΄ μμ§ μμ΅λλ€.
κ° μΆκ° νλ‘―μ΄ μΆκ°λλ κ²μ²λΌ 보μ΄λ λ©λͺ¨λ¦¬ μμ μΌλ§μ λκΉ?
μ’μ, μ΄κ²μ λ΄ κ²½μ° μΈ κ² κ°κ³ pandas 0.16.0μ μ¬μ©νμ§λ§ λ¬Έμ λ λ§μ€ν°μμ μμ λμμ΅λλ€.
κ°μ¬ν©λλ€. μλ λ³΄κ³ μμλ νλ€κ° ν¬ν¨λμ§ μμκΈ° λλ¬Έμ μ΄λ € μμ΅λλ€.
μ΄κ²μ λ κ°λ¨νκ² μ¬ν ν μ μμ΅λλ€.
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.ticker
%matplotlib inline
import os
import sys
import StringIO
import urllib, base64
from matplotlib import rcParams
rcParams['figure.figsize'] = (24, 6)
rcParams['figure.dpi'] = 150
def friendlyPlot():
fig, ax = plt.subplots()
ax.plot(range(1000))
fig.savefig('tmp.png')
plt.close('all')
for i in range(500):
friendlyPlot()
μ΄κ²μ λ©λͺ¨λ¦¬ λμΆμ΄ μμΌλ―λ‘ pyplot μΈ‘μ΄ μλ IPython μΈ‘μ μμ΅λλ€ (μ μκ°μ).
import matplotlib
matplotlib.use('agg')
import matplotlib.pyplot as plt
import matplotlib.ticker
import os
import sys
import StringIO
import urllib, base64
from matplotlib import rcParams
rcParams['figure.figsize'] = (24, 6)
rcParams['figure.dpi'] = 150
def friendlyPlot():
fig, ax = plt.subplots()
ax.plot(range(1000))
fig.savefig('tmp.png')
plt.close('all')
for i in range(500):
friendlyPlot()
@tacaswell ν μ€νΈ μ½λλ₯Ό μ¬μ©νλ©΄ Windows 7μ IPythonμ μ¬κΈ°μ μ½ 1.7GBλ₯Ό μλΉνλ©° λμ€μ ν΄μ λμ§ μμ΅λλ€. μ½κ° λ λ§μ λ°λ³΅ νμλ‘ μ€ννλ©΄ λ©λͺ¨λ¦¬ μ€λ₯κ° λ°μν©λλ€. κ·Έλμ μ΄κ²μ μ¬μ ν ββλ¬Έμ μ λλ€.
@asteppke 첫 λ²μ§Έ λλ λ λ²μ§Έ λΈλ‘?
@tacaswell 첫 λ²μ§Έ ν
μ€νΈ μ½λ ( %matplotlib inline
)λ₯Ό μ¬μ©νλ©΄ λ©λͺ¨λ¦¬ μ¬μ©λμ΄ 1.7GBκΉμ§ λμ΄λ©λλ€. λμ‘°μ μΌλ‘ λ λ²μ§Έ μ‘°κ° ( matplotlib.use('agg')
)μ μ¬μ©ν λ λ©λͺ¨λ¦¬ μ¬μ©λμ 50MBμμ 100MB μ¬μ΄μμλ§ λ³λν©λλ€.
λ ν μ€νΈ λͺ¨λ Python 3.4 λ° IPython λ ΈνΈλΆ λ²μ 4.0.5λ‘ μ€νλ©λλ€.
λλ μ΄κ²μ μ‘°κΈ λ κ°μ§κ³ λμμ΅λλ€. @tacaswell μ μμ μμ for 루νλ₯Ό λͺ λ² λ€μ μ€ννλ©΄ λ©λͺ¨λ¦¬ μ¬μ©λμ΄ μ¦κ°νμ§ μλ κ²μΌλ‘ λνλ¬μ΅λλ€. μ€μν λ¨μΌ μ
μμ λ§λλ μ«μ μΈ κ² κ°μ΅λλ€. IPythonμ νμ€ν μΈλΌμΈ λ°±μλλ₯Ό μν΄ μ
μμ μμ± λ λͺ¨λ μμΉμ λͺ©λ‘μ μ μ§νμ§λ§ ν΄λΉ λͺ©λ‘μ μ
μ΄ μ€ν λ ν νμ€ν μ§μμ Έμ gc.collect()
μ μν ν νμλ λ©λͺ¨λ¦¬ μ¬μ©λμ΄ λ¨μ΄μ§μ§ μμ΅λλ€.
μ°λ¦¬ μ½λκ° matplotlibμ 무μΈκ°μ λμκ² μνΈ μμ©ν μ μμ΅λκΉ? _pylab_helpers.Gcf
κ°λ₯μ±μ΄μλ κ² κ°μμ§λ§ μ무 κ²λ λΆ μ‘μ§ μλ κ² κ°μ΅λλ€.
λλ κ·Έλ¦Ό μ€ νλμ λν μ°Έμ‘°λ₯Ό μ‘κ³ κ·Έκ²μ λν΄ gc.get_referrers()
λΌκ³ λΆλ₯΄λ €κ³ νμ΅λλ€. user_nsμμλ μ°Έμ‘°λ₯Ό μ μΈνκ³ λ€λ₯Έ λͺ¨λ κ²λ€μ mpl κ°μ²΄μ²λΌ 보μμ΅λλ€. μλ§λ κ·Έλ€ μ€ λ§μ κ²λ€μ΄ μ°Έμ‘° 루νμ μμ΅λλ€. λ€λ₯Έ 무μΈκ°κ° λΆμ μ νκ² μ°Έμ‘°λ₯Ό μ μ§νκ³ μμ κ°λ₯μ±μ΄ κ°μ₯ λμ κ°μ²΄λ 무μμ
λκΉ?
λλ μ΄κ²μ λ§μΌμ€ν€ 'μμ리μ€νΈ'μ λ¨μ΄ λ¨λ¦¬κ³ μλ€. μ°λ¦¬λ κ·Έκ²μ κ³ μΉκ³ μΆμ§λ§ νμ¬λ‘μλ λ²κ·Έλ₯Ό μλ³νλ κ³Όμ μμ μ΄λ»κ² λ μ§μ μ μ΄λ£¨μ΄μΌν μ§ νμ μ΄ μμ§ μμΌλ©° 릴리μ€λ₯Ό 보λ₯ ν κ°μΉκ° μλ€κ³ μκ°ν©λλ€.
λ°μ ν μμλ μ¬λμ λꡬλ λΈλΌμ°λ ν¬μΈνΈλ₯Όλ°μ΅λλ€. λν μΌμ΄ν¬.
μ€μ λ‘ μ§νλμ§λ μμ§λ§ 컀λ λ΄λΆ μ΄λκ°μμ λ©λͺ¨λ¦¬κ° μμ€ λ κ² κ°μ΅λλ€. 루ν λμλ§ μ΄ν λλ λ΄λΆμμ gc.collect()
νΈμΆνμ§λ μμΌλ©° summary.print_(summary.summarize(muppy.get_objects()))
λ λμ λ λ©λͺ¨λ¦¬λ₯Ό μ°Ύμ§ λͺ»ν©λλ€. λͺ¨λ _N
λ° _iN
λ₯Ό None
λμλ§λ‘ μ€μ νλ κ²λ μλλλ€. μ λ§ μ λΉ μ€λ½μ΅λλ€.
λν μμ§ ν μμλ κ°μ²΄λ₯Ό μμ±νλμ§ κΆκΈνμ§λ§ λ€λ₯Έ μ°Έμ‘°κ°μλ κ²½μ° gc.garbage
λλμΌνλ©° RAMμ λ§μ΄ μ¬μ©νλ κ²μ 보면 μ¬μ ν λΉμ΄ μμ΅λλ€.
λλ μ΄λ¬ν κ²λ€μ λν΄ μλ μ¬λμ΄ C λ 벨 λꡬλ₯Ό μ¬μ©νμ¬ ν΄μ λμ§ μμ λ©λͺ¨λ¦¬λ₯Ό μΆμ ν΄μΌνλ€κ³ μκ°ν©λλ€. μ°λ¦¬κ° μ°Ύμ μμλ κ³³μμλ μ¬λΆμ νμ΄μ¬ κ°μ²΄κ° μ΄μ μλ€λ μ¦κ±°κ° μμ΅λλ€.
λ λ²μ§Έλ‘μ΄ λ¬Έμ μ λν μμ μ μ£Όμλ©΄ κ°μ¬νκ² μ΅λλ€.
μ°λ¦¬λ μκ³ μμ§λ§ νμ¬ μ무λ λ²κ·Έμ μμΈμ νμ νμ§ λͺ»νμ΅λλ€.
+1
+1
BTW, λλ μ΅μ matplotlib, pandas, jupyter, ipythonμμ λλλ‘μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκ³ μμ΅λλ€. μ΄ λ€μ€ νλ‘μΈμ€ ν΅μ λ¬Έμ λ₯Ό ν΄κ²°νλ λ° λμμ΄ λ μμλ λλ²κ±°λ₯Ό μλ μ¬λμ΄ μμΌλ©΄ μλ €μ£Όμμμ€.
λΈλΌμ°μ μΊμ λ©μ»€λμ¦κ³Ό κ΄λ ¨μ΄μμ μ μμ΅λκΉ?
μ’μ μκ°μ΄μ§λ§ κ·Έλ κ² μκ°νμ§ μμ΅λλ€. λΈλΌμ°μ κ° μλ μΆκ° λ©λͺ¨λ¦¬λ₯Ό μ°¨μ§νλ IPythonμ νλ‘μΈμ€μ
λλ€.
@tacaswell μ μ¬μμ°μ νλ‘―μ λΈλΌμ°μ λ‘ λ³΄λ΄λ κ²μ ν¬ν¨νμ§ μμ΅λλ€.
μλ νμΈμ, μ λ λ²μΈμ μΌλΆμμ΄ λ¬Έμ λ₯Ό μμ νλ μλμ§λ§ ν¬κ² μ€μΌ μμλ λ°©λ²μ μ°Ύμλ€ κ³ μκ°ν©λλ€!
ipykernel/pylab/backend_inline.py
μ½λλ₯Ό μ€ν¬λ‘€ ν ν λν ν λͺ¨λκ° "νλ‘―-물건"μ λ§μ΄ μ μ₯νλ€λ μ§κ°μ μ»μμ΅λλ€. μμ ν μ΄ν΄νμ§λ λͺ»νμ§λ§ μ νν μ΄μ λ₯Ό μ°Ύμ λΌ μ μμ΅λλ€. νμ€νκ².
λ€μμμ΄λ₯Ό νμΈνλ μ½λμ λλ€ (μμ @tacaswell μ€ λν« κΈ°λ°). μμ μ ꡬννλ €λ λͺ¨λ μ¬λμκ² μ μ©ν©λλ€.
μ΄κΈ°ν :
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.ticker
%matplotlib inline
matplotlib.rcParams['figure.figsize'] = (24, 6)
matplotlib.rcParams['figure.dpi'] = 150
from resource import getrusage
from resource import RUSAGE_SELF
def friendlyPlot():
fig, ax = plt.subplots()
ax.plot(range(1000))
fig.savefig('tmp.png')
plt.close('all')
μ€μ ν μ€νΈ :
print("before any: {:7d} kB".format(getrusage(RUSAGE_SELF).ru_maxrss))
friendlyPlot()
print("before loop: {:7d} kB".format(getrusage(RUSAGE_SELF).ru_maxrss))
for i in range(50):
friendlyPlot()
print("after loop: {:7d} kB".format(getrusage(RUSAGE_SELF).ru_maxrss))
import gc ; gc.collect(2)
print("after gc: {:7d} kB".format(getrusage(RUSAGE_SELF).ru_maxrss))
루νλ₯Ό 50 ν λ°λ³΅νλ©΄ λ€μκ³Ό κ°μ κ²°κ³Όκ° λνλ©λλ€.
before any: 87708 kB
before loop: 106772 kB
after loop: 786668 kB
after gc: 786668 kB
루νλ₯Ό 200 λ² λ°λ³΅νλ©΄ λ€μκ³Ό κ°μ κ²°κ³Όκ° λνλ©λλ€.
before any: 87708 kB
before loop: 100492 kB
after loop: 2824316 kB
after gc: 2824540 kB
λ°λ³΅μ λ°λ₯Έ λ©λͺ¨λ¦¬μ κ±°μ μ νμ μΈ μ¦κ°λ₯Ό 보μ¬μ€λλ€.
μ΄μ μμ / ν΄κ²° λ°©λ² : ν
μ€νΈ μ€ λν« μ μ matplotlib.interactive(False)
λ₯Ό νΈμΆ ν λ€μ μ€νν©λλ€.
50 ν λ°λ³΅ :
before any: 87048 kB
before loop: 104992 kB
after loop: 241604 kB
after gc: 241604 kB
200 ν λ°λ³΅ :
before any: 87536 kB
before loop: 103104 kB
after loop: 239276 kB
after gc: 239276 kB
μ΄λ λ°λ³΅κ³Ό 무κ΄νκ² μΌμ ν μ¦κ° λ§ λ¨μμμ νμΈν©λλ€.
μ΄ μ«μλ₯Ό μ¬μ©νμ¬ λ°λ³΅ λΉ λμΆ ν¬κΈ°λ₯Ό λλ΅μ μΌλ‘ μΆμ ν©λλ€.
(786668-(241604 - 104992))/50 = 13001.12
(2824316-(241604 - 104992))/200 = 13438.52
κ·Έλ¦¬κ³ λ£¨νμ λ¨μΌ λ°λ³΅μ λν΄ 13560
μ»μ΅λλ€. λ°λΌμ λ°λ³΅ λΉ λμ μμ μμ (> 3MB) λλ png μμΆ (54KB) μ΄λ―Έμ§ ν¬κΈ°λ³΄λ€ ν¨μ¬ μμ΅λλ€.
λν μ΄μνκ²λ 컀λμ λ€μ μμνμ§ μκ³ λμΌν μ μμ μκ·λͺ¨ ν μ€νΈ (λͺ λ²λ§ λ°λ³΅)λ₯Ό λ°λ³΅μ μΌλ‘ μ€ννλ κ²μ ν¨μ¬ μΌκ΄μ±μ΄ μμ΄μμ΄λ₯Ό μ΄ν΄νκ±°λ ν¨ν΄μ κ²°μ ν μ μμμ΅λλ€.
λ΄λΆμ λν λ λ§μ μ§μμ κ°μ§ μ¬λμ΄ μ¬κΈ°μμ κ°μ Έκ° μ μκΈ°λ₯Ό λ°λλλ€. μ§κΈ λΉμ₯ λ κΉμ΄ νκ³ λ€ μμλ μκ°κ³Ό μ§μμ΄ λΆμ‘±νκΈ° λλ¬Έμ λλ€.
ν¨κ³Όκ°μλ€
κ°μ₯ μ μ©ν λκΈ
λ λ²μ§Έλ‘μ΄ λ¬Έμ μ λν μμ μ μ£Όμλ©΄ κ°μ¬νκ² μ΅λλ€.