相关疑难解决方法(0)

我怎样才能在Python中明确释放内存?

我写了一个Python程序,它作用于一个大的输入文件,创建了几百万个表示三角形的对象.算法是:

  1. 读取输入文件
  2. 处理文件并创建由顶点表示的三角形列表
  3. 以OFF格式输出顶点:顶点列表,后跟三角形列表.三角形由顶点列表中的索引表示

在打印三角形之前打印出完整的顶点列表的OFF的要求意味着在将输出写入文件之前我必须在内存中保存三角形列表.与此同时,由于列表的大小,我遇到了内存错误.

告诉Python我不再需要某些数据的最佳方法是什么,它可以被释放?

python memory memory-management

338
推荐指数
9
解决办法
42万
查看次数

了解python中的内存使用情况

我试图理解python如何使用内存来估计我一次可以运行多少进程.现在我在具有大量ram(~90-150GB可用RAM)的服务器上处理大文件.

对于测试,我会在python中做一些事情,然后查看htop以查看用法是什么.

步骤1:我打开一个2.55GB的文件并将其保存为字符串

with open(file,'r') as f:
    data=f.read()
Run Code Online (Sandbox Code Playgroud)

用法是2686M

第2步:我将文件拆分为换行符

data = data.split('\n')
Run Code Online (Sandbox Code Playgroud)

用法是7476M

第3步:我只保留每4行(我删除的三行中的两行与我保留的行长度相等)

data=[data[x] for x in range(0,len(data)) if x%4==1]
Run Code Online (Sandbox Code Playgroud)

用量是8543M

第4步:我将其拆分为20个相等的块以运行多处理池.

l=[] 
for b in range(0,len(data),len(data)/40):
    l.append(data[b:b+(len(data)/40)])
Run Code Online (Sandbox Code Playgroud)

用量是8621M

第五步:我删除数据,用法是8496M.

有几件事对我来说没有意义.

在第二步中,当我将字符串更改为数组时,为什么内存使用量会增加很多.我假设数组容器比字符串容器大得多?

在第三步中,为什么数据不会显着缩小.我基本上摆脱了3/4的阵列和阵列中至少2/3的数据.我希望它会相应缩小.调用垃圾收集器没有任何区别.

奇怪的是,当我将较小的数组分配给另一个变量时,它使用较少的内存. 用法6605M

当我删除旧对象时data: 用法6059M

这对我来说似乎很奇怪.任何有关缩小我的记忆足迹的帮助将不胜感激.

编辑

好吧,这让我头疼.很明显,python在幕后做了一些奇怪的事情......而且只有python.我已经使用我的原始方法和下面答案中建议的方法制作了以下脚本来演示这一点.数字都是GB.

测试代码

import os,sys
import psutil
process = psutil.Process(os.getpid())
import time

py_usage=process.memory_info().vms / 1000000000.0
in_file = "14982X16.fastq"

def totalsize(o):
    size = 0
    for x in o:
        size += sys.getsizeof(x)
    size += sys.getsizeof(o)
    return "Object size:"+str(size/1000000000.0)

def …
Run Code Online (Sandbox Code Playgroud)

python memory

5
推荐指数
1
解决办法
1663
查看次数

标签 统计

memory ×2

python ×2

memory-management ×1