我正在开发一个包含大数据的项目,当我运行脚本时经常遇到 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/