Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapa Saya Tidak Boleh Mencipta Tatasusunan NumPy Besar pada Ubuntu, dan Bagaimana Saya Boleh Membetulkan Ralat Peruntukan Memori?

Mengapa Saya Tidak Boleh Mencipta Tatasusunan NumPy Besar pada Ubuntu, dan Bagaimana Saya Boleh Membetulkan Ralat Peruntukan Memori?

Patricia Arquette
Patricia Arquetteasal
2024-11-27 11:44:09534semak imbas

Why Can't I Create Large NumPy Arrays on Ubuntu, and How Can I Fix the Memory Allocation Error?

Isu Peruntukan Memori dalam Penciptaan Numpy Array

Masalah

Apabila mencipta tatasusunan NumPy yang besar dengan jenis data 'uint8' pada Ubuntu 18, anda boleh menghadapi ralat:

numpy.core._exceptions.MemoryError: Unable to allocate array with shape and data type uint8

Ini berlaku walaupun sistem mempunyai memori yang mencukupi dan tidak mengalami isu yang sama pada MacOS.

Penyelesaian

Punca isu ini ialah mod pengendalian overcommit sistem pengendalian. Secara lalai, overcommit dinyahdayakan, yang bermaksud kernel akan menolak peruntukan yang melebihi memori yang tersedia.

Untuk menyelesaikannya:

  1. Semak mod overcommit semasa dengan menjalankan cat /proc/ sys/vm/overcommit_memory.
  2. Dayakan komitmen berlebihan yang agresif dengan menjalankan echo 1 > /proc/sys/vm/overcommit_memory (sebagai akar).

Memahami Overcommit

Dengan lebih agresif didayakan, sistem membenarkan peruntukan walaupun melebihi memori fizikal. Ini kerana kernel menjangkakan bahawa hanya sebahagian kecil daripada memori yang diperuntukkan akan digunakan secara aktif.

Implikasi

Walaupun terlalu komitmen yang agresif boleh menyelesaikan isu peruntukan, ia harus digunakan dengan berhati-hati:

  • Elakkan menggunakan overcommit yang agresif untuk tatasusunan yang tidak jarang, kerana ia boleh menyebabkan keletihan memori.
  • Jika anda menulis secara manual ke lokasi memori, pastikan ralat halaman dicetuskan secara eksplisit untuk memperuntukkan memori fizikal.
  • Berhati-hati bahawa sistem mungkin mengalami kemerosotan prestasi jika memori yang diperuntukkan digunakan secara aktif.

Contoh

Dengan komit berlebihan agresif didayakan, kod berikut harus berfungsi:

import numpy as np
a = np.zeros((156816, 36, 53806), dtype='uint8')
print(a.nbytes)  # Output: 303755101056

Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Mencipta Tatasusunan NumPy Besar pada Ubuntu, dan Bagaimana Saya Boleh Membetulkan Ralat Peruntukan Memori?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn