我正在处理一个大数据项目,而且当我运行我的脚本时,经常遇到MemoryError。它包含一个由我的脚本读取的文件列表上的循环,在3或4个文件后,出现此错误。MemoryError后删除变量
我觉得写这样的事情:
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
SCRIPT:
# -*- 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 " "
谢谢;)
不要读取文件一次,由线读取线,一旦名都被重新分配或走出去的范围旧值将被gc'd所以你不需要做任何事情,那么几乎可以肯定因为你的文件很大,并且一下子就把整个文件读入内存中例如你实际上暂时保留两个完整副本 –
重新定义文件到'files = []' –
我只需要用[]替换fichier_entier.split(“\ n”)? – Deadpool