我正在處理一個大數據項目,而且當我運行我的腳本時,經常遇到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