Astropy: memmap ๋ฒ„๊ทธ์— ๋งž๋Š” ๊ฐ€๋Šฅ์„ฑ : memmap์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2013๋…„ 08์›” 26์ผ  ยท  12์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: astropy/astropy

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
Bug Effort-medium Package-intermediate io.fits

๋ชจ๋“  12 ๋Œ“๊ธ€

์–ด๋–ค 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์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋ถˆํ–‰ํžˆ๋„ ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹™๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰