Astropy: Kemungkinan kecocokan memmap bug: memmap tidak berfungsi.

Dibuat pada 26 Agu 2013  ·  12Komentar  ·  Sumber: astropy/astropy

Saya mencoba memuat beberapa tabel rekaman FITS raksasa menggunakan memmap=True , dan saya mendapatkan error: [Errno 12] Cannot allocate memory .

Contoh sesi:

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]

Kesalahannya ada di baris ini:

/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

Saya tidak benar-benar tahu apa yang sedang terjadi, tetapi saya curiga memmap secara tidak tepat memutuskan berapa banyak data yang harus dibaca. Adakah tips tentang cara men-debug lebih lanjut? Apakah ini sebenarnya masalah FITS, atau masalah numpy?

Rincian:

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

Semua 12 komentar

OS apa?

Apa ulimit -v kembali?

OS adalah beberapa jenis linux; tidak tahu dari atas kepalaku atau
perintah termudah untuk mengetahuinya.

Juga, menggunakan anaconda menginstal python / astropy / numpy tetapi ditingkatkan
astropi melalui pip.

$ ulimit -v
tak terbatas

Pada hari Selasa, 27 Agustus 2013 pukul 16.02, Erik Bray [email protected] menulis:

OS apa?

Apa ulimit -v return?

-
Balas email ini secara langsung atau lihat di Gi tHubhttps: //github.com/astropy/astropy/issues/1380#issuecomment -23374814
.

Adam

Apa yang ditampilkan 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

... sepertinya hanya ada sedikit memori; 2 GB? Hrmph.

@keflavich - apakah Anda masih mengalami masalah ini?

Benar-benar lupa tentang ini. MemTotal hanyalah total memori fisik yang tersedia. 2GB ini tidak banyak, tentu, tapi seharusnya bukan itu masalahnya. Anda memiliki sekitar 32 TB untuk VmallocTotal yang seharusnya penting di sini - pada prinsipnya mmap harus dapat menggunakan sebagian besar dari itu. Jadi ada sesuatu yang mencurigakan sedang terjadi di sini.

Ah! Saya rasa saya melihat masalahnya di sini. Secara default PyFITS menggunakan MAP_PRIVATE saat membuka file dalam mode readonly sehingga pengguna masih dapat memodifikasi larik data di tempat seperti yang akan mereka lakukan jika seluruh file dipetakan ke dalam memori utama.

Masalahnya, itu berarti pada prinsipnya seluruh file dapat ditimpa, jadi mmap harus dapat mengalokasikan memori yang cukup sebelumnya jika itu terjadi. Itulah mengapa ini terjadi di sini. PyFITS / Astropy pasti harus menangkap skenario itu dan memberikan kesalahan yang lebih bermanfaat.

Saat ini ada dua cara untuk melakukannya: Anda dapat membuka file dengan mode='denywrite . Saya menambahkannya beberapa waktu yang lalu khusus untuk kasus ini, tetapi jarang digunakan. Itu membuka mmap dengan MAP_SHARED | PROT_READ --ini berarti halaman-halaman tersebut hanya-baca (setiap upaya untuk mengubah array akan menghasilkan pengecualian). Tetapi jika yang Anda butuhkan hanyalah membaca data, ini berfungsi dengan baik, dan saya rasa tidak perlu mengalokasikan ruang swap apa pun.

Kemungkinan lain adalah membuka dengan mode='update' . Kemudian setiap perubahan pada array dapat disinkronkan langsung kembali ke file yang baik-baik saja jika Anda menginginkannya, tetapi jelas tidak terlalu banyak jika Anda tidak menginginkannya.

Melihat halaman manual, sepertinya juga ada sebuah flag, setidaknya di Linux, bernama MAP_NORESERVE yang akan mencegahnya mengalokasikan ruang untuk copy-on-write. Jadi, jika Anda tidak _perlu_ menulis perubahan apa pun ke seluruh larik yang juga bisa berfungsi. Tetapi kami harus dapat menangkap SIGSEGV yang dihasilkan jika Anda akhirnya kehabisan ruang swap.

Berhasil mereproduksi ini secara langsung - memang, kedua solusi yang saya tawarkan ( mode='denywrite' dan mode='update' bekerja. Masih akan mencoba melihat apa yang dapat saya lakukan tentang MAP_NORESERVE , dan sebaliknya menangkap kesalahan ini dan memberikan pesan kesalahan yang lebih baik.

Gangguan: numpy.memmap tidak mengizinkan pengubahan flag yang diteruskan ke panggilan mmap . Meskipun melihatnya, tidak lebih dari subclass ringan ndarray yang menangani pekerjaan pembuatan mmap dengan flag yang tepat dan kemudian memanggil ndarray.__new__ dengan mmap sebagai buffernya. Itu juga menambahkan metode flush .

Seharusnya cukup mudah untuk menghindari penggunaan numpy.memmap sama sekali dan menangani sendiri mmap. Tapi itu masih lebih dari yang ingin saya lakukan untuk saat ini. Jadi, saya akan menyelesaikan masalah ini dengan menemukan kesalahan dan menyarankan salah satu solusi yang ada.

Perhatikan bahwa dengan # 7597 kita tidak lagi menggunakan np.memmap , jadi akan lebih mudah untuk menggunakan tanda lain jika itu berguna.

Ini sekarang dapat ditutup, karena solusi telah digabungkan di https://github.com/astropy/astropy/pull/7926. MAP_NORESERVE tidak tersedia dari Python, jadi sayangnya itu bukan solusi.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

Amarchuk picture Amarchuk  ·  3Komentar

eteq picture eteq  ·  3Komentar

JWDobken picture JWDobken  ·  3Komentar

pllim picture pllim  ·  3Komentar

pllim picture pllim  ·  3Komentar