Saya menghadapi masalah dengan mengalokasikan array besar di numpy di Ubuntu 18 sementara tidak menghadapi masalah yang sama di MacOS.
Saya mencoba mengalokasikan memori untuk array numpy dengan bentuk (156816, 36, 53806)
dengan
np.zeros((156816, 36, 53806), dtype='uint8')
dan sementara saya mendapatkan kesalahan pada OS Ubuntu
>>> import numpy as np
>>> np.zeros((156816, 36, 53806), dtype='uint8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
numpy.core._exceptions.MemoryError: Unable to allocate array with shape (156816, 36, 53806) and data type uint8
Saya tidak mendapatkannya di MacOS:
>>> import numpy as np
>>> np.zeros((156816, 36, 53806), dtype='uint8')
array([[[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
...,
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0]],
[[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
...,
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0]],
[[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
...,
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0]],
...,
[[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
...,
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0]],
[[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
...,
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0]],
[[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
...,
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0]]], dtype=uint8)
Saya telah membaca di suatu tempat yang np.zeros
seharusnya tidak benar-benar mengalokasikan seluruh memori yang dibutuhkan untuk array, tetapi hanya untuk elemen bukan nol. Padahal mesin Ubuntu memiliki memori 64 GB, sedangkan MacBook Pro saya hanya memiliki 16 GB.
versi:
Ubuntu
os -> ubuntu mate 18
python -> 3.6.8
numpy -> 1.17.0
mac
os -> 10.14.6
python -> 3.6.4
numpy -> 1.17.0
PS: juga gagal di Google Colab
python
numpy
data-science
Martin Brisiak
sumber
sumber
top
danfree -m
, perintah-perintah itu di mana mendorong 60 GB mem gratis dan lebih banyak laginp.zeros
tidak membuatsparse
matriks. Mungkin ada penundaan dalam mengisi angka nol. Tetapi lihat stackoverflow.com/q/27464039Jawaban:
Ini mungkin karena mode penanganan overcommit sistem Anda .
Dalam mode default
0
,,Heuristik yang tepat digunakan tidak dijelaskan dengan baik di sini, tetapi ini dibahas lebih lanjut di Linux daripada heuristik komit dan di halaman ini .
Anda dapat memeriksa mode overcommit Anda saat ini dengan menjalankan
$ cat /proc/sys/vm/overcommit_memory 0
Dalam hal ini Anda mengalokasikan
>>> 156816 * 36 * 53806 / 1024.0**3 282.8939827680588
~ 282 GB, dan kernel mengatakan dengan baik jelas tidak ada cara saya akan dapat melakukan banyak halaman fisik untuk ini, dan menolak alokasi.
Jika (sebagai root) Anda menjalankan:
$ echo 1 > /proc/sys/vm/overcommit_memory
Ini akan mengaktifkan mode "selalu overcommit", dan Anda akan menemukan bahwa memang sistem akan memungkinkan Anda untuk membuat alokasi tidak peduli seberapa besar itu (setidaknya dalam memori 64-bit).
Saya menguji ini sendiri pada mesin dengan RAM 32 GB. Dengan mode overcommit
0
saya juga mendapatMemoryError
, tetapi setelah mengubahnya kembali1
berfungsi:>>> import numpy as np >>> a = np.zeros((156816, 36, 53806), dtype='uint8') >>> a.nbytes 303755101056
Anda kemudian dapat melanjutkan dan menulis ke lokasi mana pun dalam larik, dan sistem hanya akan mengalokasikan halaman fisik saat Anda secara eksplisit menulis ke halaman itu. Jadi, Anda dapat menggunakan ini, dengan hati-hati, untuk larik jarang.
sumber
/proc/sys
pengaturan pada distribusi Anda.Saya memiliki masalah yang sama di Window's dan menemukan solusi ini. Jadi jika seseorang menemukan masalah ini di Windows, solusi bagi saya adalah meningkatkan ukuran pagefile , karena ini juga merupakan masalah komitmen berlebihan Memori bagi saya.
Windows 8
Windows 10
Catatan: Saya tidak memiliki cukup memori di sistem saya untuk ~ 282GB dalam contoh ini, tetapi untuk kasus khusus saya ini berhasil.
EDIT
Dari sini rekomendasi yang disarankan untuk ukuran file halaman:
Beberapa hal yang perlu diperhatikan dari sini :
Juga:
sumber
MemoryError: Unable to allocate 10.3 PiB for an array with shape (38137754, 38137754) and data type float64
Saya juga menemukan masalah ini di Windows. Solusi bagi saya adalah beralih dari Python versi 32-bit ke 64-bit . Memang, perangkat lunak 32-bit, seperti CPU 32-bit, dapat memiliki ukuran maksimum 4 GB RAM (2 ^ 32). Jadi jika Anda memiliki lebih dari 4 GB RAM, versi 32-bit tidak dapat memanfaatkannya.
Dengan Python versi 64-bit (yang berlabel x86-64 di halaman unduhan), masalah ini menghilang.
Anda dapat memeriksa versi yang Anda miliki dengan memasukkan penerjemah. Saya, dengan versi 64-bit, sekarang memiliki
Python 3.7.5rc1 (tags/v3.7.5rc1:4082f600a5, Oct 1 2019, 20:28:14) [MSC v.1916 64 bit (AMD64)]
:, di mana [MSC v.1916 64 bit (AMD64)] berarti "64-bit Python".Catatan : pada saat penulisan ini (Mei 2020), matplotlib tidak tersedia di python39, jadi saya merekomendasikan untuk menginstal python37, 64 bit.
Sumber:
Quora - kesalahan memori yang dihasilkan oleh array numpy besar
Stackoverflow: Python versi 32 atau 64-bit
sumber
Dalam kasus saya, menambahkan atribut dtype mengubah dtype array menjadi tipe yang lebih kecil (dari float64 ke uint8), mengurangi ukuran array agar tidak membuang MemoryError di Windows (64 bit).
dari
untuk
mask = np.zeros(edges.shape,dtype='uint8')
sumber
Terkadang, kesalahan ini muncul karena kernel telah mencapai batasnya. Coba restart kernel, ulangi langkah-langkah yang diperlukan.
sumber
ubah tipe data ke tipe lain yang menggunakan lebih sedikit memori. Bagi saya, saya mengubah tipe datanya menjadi numpy.uint8:
data['label'] = data['label'].astype(np.uint8)
sumber