gpt4 book ai didi

python - 当我分配一个巨大的 ndarray 时,numpy 空在做什么?

转载 作者:行者123 更新时间:2023-11-28 21:51:45 25 4
gpt4 key购买 nike

我正在查看 numpy 数组在内存中消耗了多少空间,我注意到了一个奇怪的行为:

当我运行 x = np.empty((1000000, 7, 64, 64), dtype=np.uint8)

我的 16GB 内存的电脑没有死机。相反,它在分配 2GB 内存的情况下运行顺利。

这个 numpy 数组应该有 26.70 GB 的重量,但似乎有些懒惰的事情正在发生。当我添加一个时,懒惰立即停止,我的程序挂起,他们得到一个 MemoryError

我想知道 numpy 是如何在幕后做到这一点的。

我查看了 numpy.core.multiarray,发现 numpy/core/src/multiarray/multiarraymodule.c 中的这段代码似乎是空的定义:

static PyObject *
array_empty(PyObject *NPY_UNUSED(ignored), PyObject *args, PyObject *kwds)
{

static char *kwlist[] = {"shape","dtype","order",NULL};
PyArray_Descr *typecode = NULL;
PyArray_Dims shape = {NULL, 0};
NPY_ORDER order = NPY_CORDER;
npy_bool is_f_order;
PyArrayObject *ret = NULL;

if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&|O&O&", kwlist,
PyArray_IntpConverter, &shape,
PyArray_DescrConverter, &typecode,
PyArray_OrderConverter, &order)) {
goto fail;
}

switch (order) {
case NPY_CORDER:
is_f_order = NPY_FALSE;
break;
case NPY_FORTRANORDER:
is_f_order = NPY_TRUE;
break;
default:
PyErr_SetString(PyExc_ValueError,
"only 'C' or 'F' order is permitted");
goto fail;
}

ret = (PyArrayObject *)PyArray_Empty(shape.len, shape.ptr,
typecode, is_f_order);

PyDimMem_FREE(shape.ptr);
return (PyObject *)ret;

fail:
Py_XDECREF(typecode);
PyDimMem_FREE(shape.ptr);
return NULL;
}

我想知道这种懒惰是如何在 C 中实现的,以及它会在 numpy 中的其他什么地方出现。

最佳答案

请注意,内核 可能会执行惰性分配。 IE。 malloc 实际上并不保留内存。当第一次访问内存时,将发生页面错误,内核将执行实际分配(并且可能决定只分配该内存页而不是整个数组)。

换句话说:C 不是懒惰的。是内核推迟了分配。

当您尝试向数组元素添加 1 时会发生错误,因为该操作会修改所有内存位置,因此内核被迫将所有数组实际放入内存并失败。


我不是操作系统内存管理方面的专家,所以以上是我记得的操作系统类(class)。可以找到一个引用 here .引用它:

Linux on the other hand is seriously broken. It will by default answer "yes" to most requests for memory, in the hope that programs ask for more than they actually need.

它的意思是内核 malloc 几乎从不返回 NULL,即使所需的内存太大。它“希望”用户实际上不会使用他们请求的所有内存,这样他就可以避免加载一些页面并适合所需的数据。显然,这并不总是正确的。

关于python - 当我分配一个巨大的 ndarray 时,numpy 空在做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29516888/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com