python - MemoryError后删除变量

标签 python memory

我正在开发一个包含大数据的项目,当我运行脚本时经常遇到 MemoryError。它包含一个由我的脚本读取的文件列表上的循环,在 3 或 4 个文件后,出现此错误。

我想写这样的东西:

with open("E:\New_Fields\liste_essai.txt", "r") as f :

    fichier_entier = f.read()
    files = fichier_entier.split("\n")

for fichier in files :

    with open(fichier, 'r') :

    # CONDITIONS

    del var1
    del var2
    del var3

这样,我就可以将内存释放给下一个循环,也就是说,下一个文件。

但是有一种方法只需一个命令即可删除循环中的所有变量,而不是手动执行此过程? 在我的脚本中,我可能有 15 个变量,因此从我的角度来看,逐个删除每个变量并没有经过优化。

编辑:

我的文件列表是这样的:

E:\New_Fields\Field101_combined_final_roughcal.fits
E:\New_Fields\Field117_combined_final_roughcal.fits
E:\New_Fields\Field150_combined_final_roughcal.fits
E:\New_Fields\Field36_combined_final_roughcal.fits
E:\New_Fields\Field41_combined_final_roughcal.fits
E:\New_Fields\Field169_combined_final_roughcal.fits
E:\New_Fields\Field47_combined_final_roughcal.fits
E:\New_Fields\Field43_combined_final_roughcal.fits
E:\New_Fields\Field39_combined_final_roughcal.fits
E:\New_Fields\Field45_combined_final_roughcal.fits
E:\New_Fields\Field6_combined_final_roughcal.fits
E:\New_Fields\Field49_combined_final_roughcal.fits
E:\New_Fields\Field51_combined_final_roughcal.fits

脚本:

# -*- coding: utf-8 -*-
#!/usr/bin/env python

from astropy.io import fits
import numpy as np

                ###################################
                # Fichier contenant le champ brut #
                ###################################

with open("E:\New_Fields\liste_essai.txt", "r") as f :

    fichier_entier = f.read()
    files = fichier_entier.split("\n")

for fichier in files :

    with open(fichier, 'r') :

            outname = fichier.replace('combined_final_roughcal', 'mask')

        # Ouverture du fichier à l'aide d'astropy  
        field = fits.open(fichier)   
        print "Ouverture du fichier : " + str(fichier)     
        print " "  

        # Lecture des données fits
        tbdata = field[1].data   
        print "Lecture des données du fits"            

                        ###############################
                        # Application du tri sur PROB #
                        ###############################

        mask = np.bitwise_and(tbdata['PROB'] < 1.1, tbdata['PROB'] > -0.1)  
        new_tbdata = tbdata[mask]   
        print "Création du Masque"       
        print " "

                    #################################################
                    # Détermination des valeurs extremales du champ #
                    #################################################

        # Détermination de RA_max et RA_min 
        RA_max = np.max(new_tbdata['RA'])
        RA_min = np.min(new_tbdata['RA'])
        print "RA_max vaut :     " + str(RA_max)
        print "RA_min vaut :     " + str(RA_min)

        # Détermination de DEC_max et DEC_min   
        DEC_max = np.max(new_tbdata['DEC'])
        DEC_min = np.min(new_tbdata['DEC'])
        print "DEC_max vaut :   " + str(DEC_max)
        print "DEC_min vaut :   " + str(DEC_min)

                    #########################################
                    # Calcul de la valeur centrale du champ #
                    #########################################

        # Détermination de RA_moyen et DEC_moyen
        RA_central = (RA_max + RA_min)/2.
        DEC_central = (DEC_max + DEC_min)/2.

        print "RA_central vaut : " + str(RA_central)
        print "DEC_central vaut : " + str(DEC_central)

        print " "
        print " ------------------------------- "
        print " "

                ##############################
                # Détermination de X et de Y #
                ##############################


        # Creation du tableau
        new_col_data_X = array = (new_tbdata['RA'] - RA_central) * np.cos(DEC_central)
        new_col_data_Y = array = new_tbdata['DEC'] - DEC_central
        print 'Création du tableau'


        # Creation des nouvelles colonnes
        col_X = fits.Column(name='X', format='D', array=new_col_data_X)
        col_Y = fits.Column(name='Y', format='D', array=new_col_data_Y)
        print 'Création des nouvelles colonnes X et Y'


        # Creation de la nouvelle table
        tbdata_final = fits.BinTableHDU.from_columns(new_tbdata.columns + col_X + col_Y)

        # Ecriture du fichier de sortie .fits
        tbdata_final.writeto(outname)
        print 'Ecriture du nouveau fichier mask : ' + outname

        del field, tbdata, mask, new_tbdata, new_col_data_X, new_col_data_Y, col_X, col_Y, tbdata_final


        print " "
        print " ......................................................................................"
        print " "

谢谢;)

最佳答案

查看 opening-a-fits-file 的天文文档:

The open() function has several optional arguments which will be discussed in a later chapter. The default mode, as in the above example, is “readonly”. The open function returns an object called an HDUList which is a list-like collection of HDU objects.

因此,这会在内存中创建一个巨大的列表,这很可能是您的问题,有一个部分 working-with-large-files :

The open() function supports a memmap=True argument that allows the array data of each HDU to be accessed with mmap, rather than being read into memory all at once. This is particularly useful for working with very large arrays that cannot fit entirely into physical memory.

这应该有助于减少内存消耗,mmap 的唯一问题是文档提到的,在 32 位系统上您将被限制为大约 2-e gigs 的文件,但在 32 位系统上您也会受到物理内存的限制位系统,因此您的 4 gig 文件无法装入内存。可能还有其他方法来限制内存使用,但请尝试使用 mmap 并看看它是如何工作的。

关于python - MemoryError后删除变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36630049/

相关文章:

python - 根据具有未知列的值类型格式化 pandas 数据框

python - "with"语句中的变量范围?

C++运算符重载内存问题

c - 在 C 中使用 a_list 结构(共享内存中的链表)实现共享内存段

c - 在 c 中将内存动态分配给现有数组之前需要检查的三个条件是什么

python - 推荐用于本地网络应用程序的 python 库/框架?

python ,Paramiko : How to do a "ssh -n user@host cmd" using paramiko?

python - 按日期绘制分组数据

c - 函数调用后指针内容被删除,为什么?

c++ - 在没有智能指针的情况下返回指向堆对象的指针