运行数据量大的脚本时内存溢出,如何清除变量释放内存?
技术分享
发布于 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
运行上述代码会导致内存溢出,报错信息与任务管理器内存占用如下:

利用 “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
运行结束后内存恢复至运行之前,代码与内存占用如下所示:

说明: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科学计算环境