我想使用 PdfPages 创建一个包含来自多个通道的数据图的 PDF 文件。它可以工作,但是对于大文件,它会填满内存,直到程序崩溃。我发现,当我添加一个额外的 for 循环时,它会创建额外的子图,内存将定期清空。
例如(可能在其他机器上数据数组必须更大才能看到效果):
from matplotlib.backends.backend_pdf import PdfPages
import matplotlib.pyplot as plt
import numpy as np
def timeplot(i, data, export_pdf):
dt = 1/2400
length = len(data)
data = data
time_array = np.arange(0,(dt*length),dt,dtype=np.double)
plt.ioff() #disable interactive mode
plt.figure(figsize=(15,8), dpi= 60, facecolor='w', edgecolor='k') #create figure
TimePlot = plt.subplot(211) #create subplot
plt.plot(time_array,data,linewidth=0.25, linestyle='-') #plot date
k = 1
#------- whith this loop "off", the memory will run full --------------
for l in range(0,5):
ax1 = plt.subplot(2,5,k+5)
k = k + 1
#-----------------------------------------------------------------------
export_pdf.savefig()
plt.close('all')
def main():
chn_count = 200
export_file_path="test.pdf"
with PdfPages(export_file_path) as export_pdf:
for i in range(0,chn_count):
data = np.random.rand(20000000)
timeplot(i, data, export_pdf)
if __name__ == "__main__":
main()
我不需要额外的子图,但是当每个通道只创建一个图时,为什么内存会用完。
我还尝试使用“multiprocessing.Process”在每次循环后清空内存。这似乎可行,但生成的 PDF 只包含数据垃圾。
有没有人有想法,有什么可以帮助的?
程序运行在:Ubuntu 20.04.3,Python 3.8.10,matplotlib 3.1.2,内存:16GB
编辑:
我尝试了Z Li提到的这个问题的解决方案:
原始代码有效,但仅将绘图保存到多个 .png 文件。当我调整示例以创建多页 PDF 时,内存也已满,如上面的代码所示。
所以我尝试只创建单页 PDF,并在最后将它们合并在一起。但是内存还是满的。