memmap=True
์ฌ์ฉํ์ฌ ๊ฑฐ๋ํ FITS ๋ ์ฝ๋ ํ
์ด๋ธ์๋ก๋ํ๋ ค๊ณ ํ๋๋ฐ error: [Errno 12] Cannot allocate memory
์ป์ต๋๋ค.
์ธ์ ์ :
filename = '/home/sdfits/AGBT12B_221_01/AGBT12B_221_01.raw.acs.fits'
import astropy.io.fits as fits
filefits = fits.open(filename,memmap=True)
data = filefits[2].data[:50]
์ค๋ฅ๋ ๋ค์ ์ค์ ์์ต๋๋ค.
/users/aginsbur/anaconda/lib/python2.7/site-packages/numpy/core/memmap.py(253)__new__()
--> 253 mm = mmap.mmap(fid.fileno(), bytes, access=acc, offset=start)
ipdb> bytes
23718381056L
ipdb> bytes/1024**2
22619L
ipdb> start
413921280
ipdb> acc
3
๋๋ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง memmap์ด ์ฝ์ ๋ฐ์ดํฐ์ ์์ ๋ถ์ ์ ํ๊ฒ ๊ฒฐ์ ํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ถ๊ฐ ๋๋ฒ๊น ๋ฐฉ๋ฒ์ ๋ํ ํ์ด ์์ต๋๊น? ์ด๊ฒ์ ์ค์ ๋ก FITS ๋ฌธ์ ์ ๋๊น, ์๋๋ฉด numpy ๋ฌธ์ ์ ๋๊น?
์ธ๋ถ:
In [15]: numpy.__version__
Out[15]: '1.7.1'
In [16]: astropy.__version__
Out[16]: '0.2.4'
In [18]: sys.maxint
Out[18]: 9223372036854775807
์ด๋ค OS?
ulimit -v
๋ ๋ฌด์์ ๋ฐํํฉ๋๊น?
OS๋ ๋ฆฌ๋
์ค์ ์ผ๋ถ์
๋๋ค. ๋ด ๋จธ๋ฆฌ ๊ผญ๋๊ธฐ์์ ๋ชจ๋ฅด๊ฑฐ๋
๊ฐ์ฅ ์ฌ์ด ๋ช
๋ น์
๋๋ค.
๋ํ python / astropy / numpy์ anaconda ์ค์น๋ฅผ ์ฌ์ฉํ์ง๋ง ์
๊ทธ๋ ์ด๋๋์์ต๋๋ค.
pip๋ฅผ ํตํ astropy.
$ ulimit -v
์ ํ ์๋
2013 ๋ 8 ์ 27 ์ผ ํ์์ผ ์คํ 4:02์ Erik Bray [email protected] ์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
์ด๋ค OS?
ulimit -v๋ ๋ฌด์์ ๋ฐํํฉ๋๊น?
โ
์ด ์ด๋ฉ์ผ์ ์ง์ ํ์ ํ๊ฑฐ๋ Gi tHub์์ ํ์ธํ์ญ์์ค.
.
์๋ด
cat /proc/meminfo
๋ ๋ฌด์์ ๋ณด์ฌ์ค๋๊น?
$ cat /proc/meminfo
MemTotal: 1903396 kB
MemFree: 203864 kB
Buffers: 215320 kB
Cached: 884708 kB
SwapCached: 2268 kB
Active: 492052 kB
Inactive: 954324 kB
Active(anon): 165684 kB
Inactive(anon): 181096 kB
Active(file): 326368 kB
Inactive(file): 773228 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 1048568 kB
SwapFree: 1031460 kB
Dirty: 24 kB
Writeback: 0 kB
AnonPages: 344352 kB
Mapped: 65676 kB
Shmem: 432 kB
Slab: 191348 kB
SReclaimable: 151148 kB
SUnreclaim: 40200 kB
KernelStack: 2312 kB
PageTables: 22940 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 2000264 kB
Committed_AS: 847268 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 286128 kB
VmallocChunk: 34359439336 kB
HardwareCorrupted: 0 kB
AnonHugePages: 12288 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 8188 kB
DirectMap2M: 2070528 kB
... ๊ทธ๊ฒ์ ์์ฃผ ์์ ์์ ๋ฉ๋ชจ๋ฆฌ์ฒ๋ผ ๋ณด์ ๋๋ค. 2GB? ์.
@keflavich-์ฌ์ ํ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๊น?
์ด๊ฒ์ ๋ํด ์์ ํ ์์์ต๋๋ค. MemTotal
๋ ์ฌ์ฉ ๊ฐ๋ฅํ ์ด ์ค์ ๋ฉ๋ชจ๋ฆฌ์
๋๋ค. ์ด 2GB๋ ๋ง์ง๋ ์์ง๋ง ๋ฌธ์ ๊ฐ๋์ง๋ ์์ต๋๋ค. ์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์ VmallocTotal
์ ๋ํด ์ฝ 32TB์
๋๋ค. ์์น์ ์ผ๋ก mmap์ ๋๋ถ๋ถ์ ์ฌ์ฉํ ์ ์์ด์ผํฉ๋๋ค. ๊ทธ๋์ ์ฌ๊ธฐ์ ๋ญ๊ฐ ์์ํ ์ผ์ด ๋ฒ์ด์ง๊ณ ์์ต๋๋ค.
์! ์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก PyFITS๋ ์ฝ๊ธฐ ์ ์ฉ ๋ชจ๋์์ ํ์ผ์ ์ด ๋ MAP_PRIVATE
์ฌ์ฉํ๋ฏ๋ก ์ฌ์ฉ์๋ ์ ์ฒด ํ์ผ์ด ์ฃผ ๋ฉ๋ชจ๋ฆฌ์ ๋งคํ ๋ ๊ฒฝ์ฐ์ฒ๋ผ ์ ์๋ฆฌ์์ ๋ฐ์ดํฐ ๋ฐฐ์ด์ ์์ ํ ์ ์์ต๋๋ค.
๋ฌธ์ ๋ ์์น์ ์ผ๋ก ์ ์ฒด ํ์ผ์ ๋ฎ์ด ์ธ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ฏ๋ก mmap์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ ๋ฏธ๋ฆฌ ์ถฉ๋ถํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น ํ ์ ์์ด์ผํฉ๋๋ค. ์ด๊ฒ์ด ์ฌ๊ธฐ์ ์ผ์ด๋๋ ์ด์ ์ ๋๋ค. PyFITS / Astropy๋ ํ์คํ ํด๋น ์๋๋ฆฌ์ค๋ฅผ ํฌ์ฐฉํ๊ณ ๋ ์ ์ฉํ ์ค๋ฅ๋ฅผ ์ ๊ณตํด์ผํฉ๋๋ค.
ํ์ฌ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์๋ ๋ ๊ฐ์ง๊ฐ ์์ต๋๋ค. mode='denywrite
ํ์ผ์ ์ด ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ๋ฅผ ์ํด ํน๋ณํ ์กฐ๊ธ ์ ์ ์ถ๊ฐํ์ง๋ง ๊ฑฐ์ ์ฌ์ฉ๋์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด MAP_SHARED | PROT_READ
mmap์ด ์ด๋ฆฝ๋๋ค. ์ด๋ ํ์ด์ง๊ฐ ์ฝ๊ธฐ ์ ์ฉ์์ ์๋ฏธํฉ๋๋ค (๋ฐฐ์ด์ ์์ ํ๋ ค๊ณ ํ๋ฉด ์์ธ๊ฐ ๋ฐ์ ํจ). ๊ทธ๋ฌ๋ ํ์ํ ๋ชจ๋ ๊ฒ์ด ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ๊ฒ์ด๋ผ๋ฉด ์ ์๋ํ๋ฉฐ ์ค์ ๊ณต๊ฐ์ ํ ๋น ํ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ ๋ค๋ฅธ ๊ฐ๋ฅ์ฑ์ mode='update'
๋ก ์ฌ๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ฐฐ์ด์ ๋ํ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ ํ์ผ์ ์ง์ ๋๊ธฐํ ํ ์ ์์ต๋๋ค. ์ํ๋ ๊ฒฝ์ฐ ๊ด์ฐฎ์ง ๋ง ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ์๋ ๊ทธ๋ค์ง ๋ง์ง ์์ต๋๋ค.
man ํ์ด์ง๋ฅผ ๋ณด๋ฉด ์ ์ด๋ Linux์๋ MAP_NORESERVE
๋ผ๋ ํ๋๊ทธ๊ฐ์๋ ๊ฒ ๊ฐ์ต๋๋ค.์ด ํ๋๊ทธ๋ copy-on-write ๊ณต๊ฐ์ ๋ฏธ๋ฆฌ ํ ๋นํ์ง ๋ชปํ๊ฒํฉ๋๋ค. ๋ฐ๋ผ์ ์ ์ฒด ๋ฐฐ์ด์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ๋ ์ธ ํ์๊ฐ _ ํ์ํ์ง ์์ ๊ฒฝ์ฐ. ํ์ง๋ง ์ค์ ๊ณต๊ฐ์ด ๋ถ์กฑ ํด์ง๋ฉด ๊ฒฐ๊ณผ๊ฐ ๋์ค๋ SIGSEGV๋ฅผ ํ์
ํ ์ ์์ด์ผํฉ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ์ง์ ์ฌํ ํ ์์์์ต๋๋ค. ์ค์ ๋ก ์ ๊ฐ ์ ๊ณต ํ ๋ ๊ฐ์ง ํด๊ฒฐ ๋ฐฉ๋ฒ ( mode='denywrite'
๋ฐ mode='update'
์๋ํฉ๋๋ค. MAP_NORESERVE
์ ๋ํด ๋ด๊ฐ ํ ์์๋ ์์
์ ๊ณ์ ํ์ธํ๋ ค๊ณ ํฉ๋๋ค. ์ด ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ๊ณ ๋ ๋์ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ฑ๊ฐ์ฌ : numpy.memmap
์์๋ mmap
ํธ์ถ์ ์ ๋ฌ๋๋ ํ๋๊ทธ๋ฅผ ์กฐ์ ํ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ์ดํด ๋ณด๋๋ผ๋ ์ฌ๋ฐ๋ฅธ ํ๋๊ทธ๋ก mmap์ ๋ง๋ ๋ค์ mmap์ ๋ฒํผ๋ก ์ฌ์ฉํ์ฌ ndarray.__new__
๋ฅผ ํธ์ถํ๋ ์์
์ ์ฒ๋ฆฌํ๋ ๊ฒ์ ndarray
์ ๊ฐ๋ฒผ์ด ํ์ ํด๋์ค์ ์ง๋์ง ์์ต๋๋ค. ๋ํ flush
๋ฉ์๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.
numpy.memmap
์ฌ์ฉ์ ์์ ํผํ๊ณ mmap์ ์ง์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ถฉ๋ถํ ์ฌ์์ผํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ์ง๊ธ ๋น์ฅ ์ ๊ฐํ๊ณ ์ถ์ ๊ฒ๋ณด๋ค ๋ ๋ง์ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์ ๋์ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ๊ณ ๊ธฐ์กด ํด๊ฒฐ ๋ฐฉ๋ฒ ์ค ํ๋๋ฅผ ์ ์ํ์ฌ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ฒ ์ต๋๋ค.
# 7597์์๋ ๋ ์ด์ np.memmap
๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฏ๋ก ์ ์ฉํ ๊ฒฝ์ฐ ๋ค๋ฅธ ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ฌ์ธ ๊ฒ์
๋๋ค.
https://github.com/astropy/astropy/pull/7926์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ๋ณํฉ๋์์ผ๋ฏ๋ก ์ด์ ๋ซ์ ์ ์์ต๋๋ค MAP_NORESERVE
์ Python์์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ๋ถํํ๋ ํด๊ฒฐ์ฑ
์ด ์๋๋๋ค.