众所周知,它与初始化分配的内存calloc不同malloc.使用时calloc,内存设置为零.使用时malloc,内存不会被清除.
所以在日常工作中,我认为calloc是malloc+ memset.顺便说一下,为了好玩,我为基准编写了以下代码.
结果令人困惑.
代码1:
#include<stdio.h>
#include<stdlib.h>
#define BLOCK_SIZE 1024*1024*256
int main()
{
int i=0;
char *buf[10];
while(i<10)
{
buf[i] = (char*)calloc(1,BLOCK_SIZE);
i++;
}
}
Run Code Online (Sandbox Code Playgroud)
代码1的输出:
time ./a.out
**real 0m0.287s**
user 0m0.095s
sys 0m0.192s
Run Code Online (Sandbox Code Playgroud)
代码2:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define BLOCK_SIZE 1024*1024*256
int main()
{
int i=0;
char *buf[10];
while(i<10)
{
buf[i] = (char*)malloc(BLOCK_SIZE);
memset(buf[i],'\0',BLOCK_SIZE);
i++;
}
}
Run Code Online (Sandbox Code Playgroud)
代码2的输出:
time ./a.out
**real 0m2.693s**
user 0m0.973s
sys 0m1.721s
Run Code Online (Sandbox Code Playgroud)
更换 …
我想知道为什么numpy.zeros占用这么小的空间?
x = numpy.zeros(200000000)
Run Code Online (Sandbox Code Playgroud)
这不占用任何记忆,
x = numpy.repeat(0,200000000)
Run Code Online (Sandbox Code Playgroud)
占用约1.5GB.numpy.zeros会创建一个空指针数组吗?如果是这样,有没有办法在cython中更改它后将指针设置为空?如果我使用:
x = numpy.zeros(200000000)
x[0:200000000] = 0.0
Run Code Online (Sandbox Code Playgroud)
内存使用率上升.有没有办法改变一个值,然后将其改回原来在python或cython中使用的格式numpy.zeros?
我正在尝试追踪内存泄漏,所以我已经完成了
import tracemalloc
tracemalloc.start()
<function call>
# copy pasted this from documentation
snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('lineno')
print("[ Top 10 ]")
for stat in top_stats[:10]:
print(stat)
Run Code Online (Sandbox Code Playgroud)
这显示没有主要分配,所有内存分配都非常小,而我看到在psand 中分配了 8+ GB 内存pmap(在运行命令之前和之后以及运行垃圾收集之后进行检查)。此外,tracemalloc.get_traced_memory确认tracemalloc没有看到很多分配。pympler也没有看到分配。
有谁知道什么时候会出现这种情况?某些模块正在使用 cython,这会导致 tracemalloc 出现问题吗?
在 pmap 中,分配看起来像:
0000000002183000 6492008 6491876 6491876 rw--- [ anon ]