我的程序可能需要长达四个小时来运行我试图读取的所有卫星数据。当我读取一整年的数据并且只保存几个区域的数据时,我已经确保代码可以正常工作。但是,当我尝试用多年的数据运行我的函数时,它最终会在循环结束时杀死 iPython 内核,说“内核已经死了。请重新启动内核”。这是我的函数 (MODIS),它调用了 2 个较小的函数,在该函数下方,程序不断死去:
from mpl_toolkits.basemap import Basemap
import numpy as np
from pyhdf.SD import SD, SDC
def int_to_bin(data):
int_bin = []
x = 0
stop = len(data)
while (x!=stop):
binn = bin(data[x])[2:]
integer = int(binn)
int_bin.append(integer)
x = x + 1
flags = np.array(int_bin)
stop = len(flags)
x = 0
while (x!=stop):
if (flags[x]==100000 or flags[x]==101000 or flags[x]==110000 or flags[x]==1000001 or flags[x]==1001001 or flags[x]==1010001):
flags[x] = 0
x = x + 1
return flags
def map():
m = Basemap(projection='cyl',llcrnrlat=-90,urcrnrlat=90,\
llcrnrlon=-180,urcrnrlon=180,resolution='c')
m.drawmapboundary(fill_color='white', zorder=-1)
m.fillcontinents(color='0.8', lake_color='white', zorder=0)
m.drawcoastlines(color='0.6', linewidth=0.5)
m.drawcountries(color='0.6', linewidth=0.5)
m.drawparallels(np.arange(-90.,91.,30.), labels=[1,0,0,1], dashes=[1,1], linewidth=0.25, color='0.5')
m.drawmeridians(np.arange(-180.,181., 60.), labels=[1,0,0,1], dashes=[1,1], linewidth=0.25, color='0.5')
return m
def MODIS(final,filenameyear,fileyear):
m = map()
harddrive = '/Volumes/Jasons_EXT/'
files = harddrive + filenameyear
file = open(files,mode='r')
try:
filenames = file.readlines()
file.close()
except OSError:
filenames = file.readlines()
file.close()
final_lon = []
final_lat = []
final_ET = []
loop = 0
while(loop != final):
if ( 30<= loop <= 60 or 316<= loop <= 346 or 602<= loop <= 632 or 888<= loop <= 918 or 1174<= loop <= 1204 or 1460<= loop <= 1490 or 1746<= loop <= 1776 or 2032<= loop <= 2062 or 2318<= loop <= 2348 or 2604<= loop <= 2634 or 2890<= loop <= 2920 or 3176<= loop <= 3206 or 3462<= loop <= 3492 or 3748<= loop <= 3778 or 4034<= loop <= 4064 or 4320<= loop <= 4350 or 4606<= loop <= 4636 or 4892<= loop <= 4922 or 5178<= loop <= 5208 or 5464<= loop <= 5494 or 5750<= loop <= 5780 or 6036<= loop <= 6066 or 6322<= loop <= 6352):
filename = filenames[loop].rstrip('\n')
final_file = harddrive + fileyear + filename
hdf = SD(final_file, SDC.READ)
attribute = hdf.attr(3)
bounds = attribute.get()
k = bounds.find('NORTHBOUNDINGCOORDINATE')
try:
start = k + 83
end = k + 100
### bounds.find('NORTHBOUNDINGCOORDINATE')#### add start,end with 83,100
nstring = bounds[start:end]
north = float(nstring)
except ValueError:
start = k + 83
end = k + 87
nstring = bounds[start:end]
north = float(nstring)
### bounds.find('SOUTHBOUNDINGCOORDINATE')#### add start,end with 83,100
k = bounds.find('SOUTHBOUNDINGCOORDINATE')
start = k + 83
end = k + 100
sstring = bounds[start:end]
south = float(sstring)
### bounds.find('EASTBOUNDINGCOORDINATE')#### add start,end with 83,100
k = bounds.find('EASTBOUNDINGCOORDINATE')
start = k + 83
end = k + 100
estring = bounds[start:end]
east = float(estring)
### bounds.find('WESTBOUNDINGCOORDINATE')#### add start,end with 83,99
k = bounds.find('WESTBOUNDINGCOORDINATE')
try:
start = k + 83
end = k + 99
wstring = bounds[start:end]
west = float(wstring)
except ValueError:
start = k + 83
end = k + 102
wstring = bounds[start:end]
west = float(wstring)
i = 0
stop = 1200
longitude = []
while(i != stop):
lon = west + (i*(east-west)/stop)
longitude.append(lon)
i = i + 1
j = 0
stop = 1200
latitude = []
while(j != stop):
lat = south + (j*(north-south)/stop)
latitude.append(lat)
j = j + 1
lat = np.array(latitude)
lon = np.array(longitude)
lon,lat = m(*np.meshgrid(lon,lat))
lon = lon.ravel()
lat = lat.ravel()
final_lat.append(lat)
final_lon.append(lon)
DATAFIELD_NAME= 'ET_1km'
data = hdf.select(DATAFIELD_NAME) ### units are kg/(m^2*8days)
ET = data[:,:]
ET_sf = data.scale_factor
ET = ET * ET_sf
ET = ET.ravel()
DATAFIELD_NAME= 'ET_QC_1km'
data = hdf.select(DATAFIELD_NAME) ### units are kg/(m^2*8days)
ET_QC = data[:,:]
ET_QC = ET_QC.ravel()
QC_flags = int_to_bin(ET_QC)
ET[np.where(QC_flags > 0)] = np.nan
final_ET.append(ET)
loop = loop + 1
return final_lon, final_lat, final_ET
我运行的数据量是每年 15-20 GB 的数据(总共 7 年)。我的程序是否因为无法处理程序所需的计算量和 RAM 而崩溃?很高兴知道为什么控制台会在我的程序例程的中间/结束时崩溃。