массив numpy, способный выделять безумные объемы памяти для больших массивов - PullRequest
0 голосов
/ 25 ноября 2018

Я новичок в NumPy.Большинству людей это может показаться немного глупым, но я нигде не могу найти ответ

x = np.zeros(1000000000000)
x.nbytes
>> 8000000000000

Это похоже на 8000 ГБ памяти.Первоначально я думал, что nbytes - это не фактические байты израсходованной памяти, а четко записано здесь , что nbytes дает общее количество байтов.

Как это возможно?Numpy использует что-то вроде ленивой нагрузки?Я уверен, что здесь что-то не так, поскольку 8000 ГБ памяти просто невозможно на моей машине с 8 ГБ ОЗУ.

PS: в Google Colab это утечка памяти

1 Ответ

0 голосов
/ 25 ноября 2018

Это, вероятно, имеет отношение к системному уровню.Я не знаю, как именно системы Google, но даже на стандартной машине Linux с 8 ГБ памяти это было бы возможно, потому что, как вы сказали, ленивая загрузка страниц.

numpy, вероятно, будет использовать malloc stdlib на моеммашина, которая для больших выделений использует систему mmap.Система должна обнулять страницы, предоставленные процессу, или она подвергается угрозе безопасности, что означает, что новые страницы mmap по умолчанию обнуляются.Поскольку вы не использовали ни одну из страниц, система не выделяет их для вас.

#include <stdio.h>
#include <unistd.h>
#include <sys/mman.h>

int main() {
    void *ptr = mmap(0, 8000000000000, PROT_READ | PROT_WRITE, MAP_SHARED, 0, 0);
    if (ptr == NULL) {
            printf("Allocating bytes failed\n");
    }
    else {
            printf("Success!\n");
    }
}

Я догадываюсь, что вас удивит (много волнений), если вы попытаетесь использовать всех вашей памяти одновременно: D.

...