3

我想使用 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,并在最后将它们合并在一起。但是内存还是满的。

4

0 回答 0