gpt4 book ai didi

python - MemoryError 后删除变量

转载 作者:太空宇宙 更新时间:2023-11-04 00:52:14 27 4
gpt4 key购买 nike

我正在处理一个包含大数据的项目,在运行我的脚本时经常遇到 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 的 astropy 文档:

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 gig 的文件,但您也会受到 32 位系统上物理内存的限制位系统,因此您的 4 gig 文件不适合内存。可能还有其他方法可以限制您的内存使用,但请尝试使用 mmap 并查看其工作原理。

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com