关于python deepcopy内存问题

这个问题主要发生在我使用numpy.load加载多个大型数据的时候,原本计划是加载一个数据,然后从其中使用deepcopy取出一部分数据,再使用del函数去进行释放空间,再加载下一个数据。但是在实际使用当中,deepcopy并没有使新数据划出空间,反而使得取出来的数据与原数据指向同一内存空间。

a = np.load(“a.npy”)
c=[]
max_size=1000
len= len(a)
perm_indices = np.random.permutation(len)[:(max_size)]
for j in perm_indices:c.append(copy.deepcopy(a[j]))

这就导致我在加载数据的时候内存不断增长直至爆炸!
所以我进行了以下的测试,首先申请了一个长度为200w的数组a,然后再重新申请一个长度和数值与一模一样的数组b,再使用deepcopy函数给数组b附上数组a的值

import numpy as np
import os
import psutil
import gc
import copy
import sys
def listcopy(x):a = len(x)b = [i for i in range(a)]for i in range(a):b[i] = copy.deepcopy(x[i])return b
print('A:%.2f MB' % (psutil.Process(os.getpid()).memory_info().rss / 1024 / 1024))
list1=[ i for i in range(2000000)]
print('B:%.2f MB' % (psutil.Process(os.getpid()).memory_info().rss / 1024 / 1024))
list2=listcopy(list1)
print('C:%.2f MB' % (psutil.Process(os.getpid()).memory_info().rss / 1024 / 1024))
del list1
gc.collect()
print('D:%.2f MB' % (psutil.Process(os.getpid()).memory_info().rss / 1024 / 1024))

他的输出如下:

A:38.52 MB
B:116.77 MB
C:131.18 MB
D:115.87 MB

如果我将listcopy()部分代码注释掉

def listcopy(x):a = len(x)b = [i for i in range(a)]#for i in range(a):#   b[i] = copy.deepcopy(x[i])return b

这就表示b是完全新申请的空间与a无关,这时候输出是

A:38.40 MB
B:115.70 MB
C:193.09 MB
D:116.06 MB

显然虽然值相同,但是比没有使用deepcopy所要占的内存要大一些,当然,我们还是要尝试一下直接使用deepcopy拷贝,也就是将list2=listcopy(list1)替换为list2=copy.deepcopy(list1)这时候输出为:

A:38.38 MB
B:116.48 MB
C:130.91 MB
D:115.63 MB

和分部拷贝差不多,但是如果我们将listcopy()函数中的复制的长度减少,也就是如下改变:

def listcopy(x):a = len(x)b = [i for i in range(a)]for i in range(int(a/2)):b[i] = copy.deepcopy(x[i])return b

他的输出将会是

A:38.51 MB
B:115.75 MB
C:163.00 MB
D:116.72 MB

我们将会看到相较于没有进行拷贝和完全拷贝,这个内存占用大于完全拷贝,小于不进行拷贝。在之后测试之中我试过将复制长度再缩小一倍,这个内存占用还会曾大。这说明deepcopy虽然是深度拷贝,但是python似乎还是将一些值指向了同样的内存。这就导致释放原数据的时候并不能完全释放。
但是我还是找到了一个不算是解决方法的方法就是在拷贝的时候直接乘1,也就是将listcopy()修改如下:

def listcopy(x):a = len(x)b = [i for i in range(a)]for i in range(a):b[i] = x[i]*1return b

这时候输出就正常了

A:38.26 MB
B:115.80 MB
C:192.86 MB
D:115.85 MB

关于python deepcopy内存问题相关推荐

  1. python多线程内存越要越大_Python 面试:这9个问题你一定要掌握!

    作为一个程序员,可能或多或少经历过一些技术面试,有些是编程语言本身的问题,有些是跟工程相关的问题. 笔者自己被面试过或者面试过别人,今天我们来总结关于Python程序员面试的时候经常被问到的9个问题, ...

  2. python 的内存回收,及深浅Copy详解

    一.python中的变量及引用 1.1 python中的不可变类型: 数字(num).字符串(str).元组(tuple).布尔值(bool<True,False>) 接下来我们讲完后你就 ...

  3. python的内存模型

    在传统的编程语言中,变量通常会被认为是被命名的内存位置.如果把这个想法应用于Python的话,你可能就会认为Python里的变量是某种小型的.与计算机内存中可以存储对象的位置相对应的东西.这种思维方式 ...

  4. python参数内存地址

    python参数内存地址 1.参数内存地址 查看某个值在内存中的地址 v1=123 id(v1) 函数值执行参数时,传递的是内存地址 #函数执行传参,传递的是内存地址 def func(data):p ...

  5. python 申请内存空间、用于创建多维数组_python 申请内存空间,用于创建多维数组的实例...

    以三维数组为例 先申请1个一维数组空间: mat = [None]*d1 d1是第一维的长度. 再把mat中每个元素扩展为第二维的长度: for i in range(len(mat)): mat[i ...

  6. python在内存中生成Zip文件!

    python在内存中生成Zip文件! - 天真的好蓝啊 - 博客园 python在内存中生成Zip文件! import zipfile import StringIO class MemoryZipF ...

  7. python共享内存

    python共享内存 共享内存(Shared Memory)是最简单的进程间通信方式,它允许多个进程访问相同的内存,一个进程改变其中的数据后,其他的进程都可以看到数据的变化. 共享内存是进程间最快速的 ...

  8. python中内存管理机制一共分为多少层_python 内存管理机制

    内存管理机制 ​python中万物皆对象,python的存储问题是对象的存储问题,并且对于每个对象,python会分配一块内存空间去存储它 ​Python的内存管理机制:引入计数.垃圾回收.内存池机制 ...

  9. 变量 常量 Python变量内存管理 赋值方式 注释

    目录 变量 1.什么是变量 2.为什么有变量? 3.定义变量 4.变量的组成 5.变量名的命名规范 6变量名的两种风格 常量 Python变量内存管理 1.变量存哪儿? 2.Python垃圾回收机制 ...

最新文章

  1. Uva 10177 - (2/3/4)-D Sqr/Rects/Cubes/Boxes?
  2. 分享一百多套开发视频教程的下载地址(转)
  3. 《大话数据结构》读书笔记-栈与队列
  4. php gif上传后不动,GIF图片上传后不动的解决办法
  5. 使用Spring Security和jdbc的Spring Boot
  6. spring mvc学习(50):java.lang.ClassNotFoundException: org.springframework.web.servlet. DispatcherSe
  7. poj 2484 A Funny Game
  8. python2转python3代码_Python2代码转成Python3代码
  9. Java基础之synchronized的讲解
  10. 如何在Mac上使用Memoji贴纸、屏幕效果、应用程序和Messages
  11. 新旧_飘云羽逸_新浪博客
  12. C#设计模式 之 抽象工厂模式
  13. 【算法】02 SCE-UA简介及源代码
  14. 计算机知识怎么记忆,计算器记忆加怎么用
  15. 4244. 【五校联考6day2】yi
  16. PLINK-GWAS学习6------数据质控之杂合率质控
  17. ImageCompressor图片压缩
  18. iOS 三方app读取苹果健康数据
  19. 光纤通信技术- 1引言
  20. 实施工程师mysql面试题_软件实施工程师面试题(下)

热门文章

  1. 初始化css样式代码、颜色、字体、浮动与清除浮动、显示、定位、盒子模型、按钮禁用、CSS画圆半圆扇形三角梯形
  2. Mac如何关闭指定端口
  3. web前端-HTML-锚点定位
  4. XP系统不识别2t以下硬盘的解决方法
  5. python获取文件修改时间 错误_python错误记录
  6. 数据结构之栈 篇四——栈应用实现进制转换
  7. 基于php历史文化名人文史类网站
  8. sql server 使用DATEADD函数时报错
  9. 基于51单片机的火灾报警系统温度烟雾浓度阈值报警proteus仿真原理图PCB
  10. Linux系统关闭防火墙命令