专栏
标签
运行数据量大的脚本时内存溢出,如何清除变量释放内存?
技术分享
发布于 2025-07-18 11:46:24
查看 1过去319天

针对运行脚本过程中因数据量大导致内存溢出的情况,有以下两种相关方法手动释放内存。

情况一:for循环次数多且数据量大

可以使用 “GC.gc()” 来手动释放内存,示例代码如下:

# 随机生成两个数据量大的数组
a = rand(20000, 20000)
b = rand(20000, 20000)
d = 0
for i = 1:10
    global a, b, c, d
    # 计算部分
    if i <= 5
        c = a .* b
        a = a .+ 2
        b = b .+ 6
    else
        d = d + i
    end
end

运行上述代码会导致内存溢出,报错信息与任务管理器内存占用如下:
image.png

利用 “GC.gc()” 释放内存可以成功运行代码:

# 随机生成两个数据量大的数组
a = rand(20000, 20000)
b = rand(20000, 20000)
d = 0
for i = 1:10
    global a, b, c, d
    # 计算部分
    if i <= 5
        c = a .* b
        a = a .+ 2
        b = b .+ 6
    else
        d = d + i
        a = nothing
        b = nothing
    end
    # 将数据清空为nothing,释放对循环中不用的数组
    c = nothing
    GC.gc()
end

运行结束后内存恢复至运行之前,代码与内存占用如下所示:
image.png
说明:GC.gc() 函数本身不会直接清除内存占用,而是强制触发垃圾回收来释放那些不再被引用的对象所占用的内存。
垃圾回收的目的是清理不再使用的内存,从而减少内存占用。

情况二:数据量很大,且要绘制并保存多张图片

可以使用下列函数释放图片内存:

using PyCall
py"""
import gc
gc.collect()
"""

示例代码如下:

using TyPlot
using PyCall

# 参数设置
sampling_rate = 7.68e6
duration = 60
num_samples = Int(sampling_rate * duration)

# 生成时间向量,维度(460800000,1)
t = LinRange(0, duration, num_samples)

# 生成信号(例如,正弦波),维度(460800000,1)
frequency = 1e6  # 1 MHz
signal = sin.(2 * π * frequency * t) 

# 绘制图片,数据量非常大,图片占用内存多
plot(t, signal)

# 释放数据内存
t = nothing
signal = nothing
num_samples = nothing
GC.gc()

# 需要关闭图窗,才可以释放图片内存
plt_close()
py"""
import gc
gc.collect()
"""
所属专栏:Syslab基础平台
产品信息:Syslab科学计算环境
科学计算

全部回答

暂无数据
暂无数据
用户
和原帖交流更多问题细节吧,去
我要发帖 我要发帖
资料中心 资料中心
查看更多>
热门帖子 热门帖子
主要贡献者 主要贡献者
过去7天