昨天晚上信心满满的把代码运行,预计大概12小时能运行结束,早上起来一看,才运行了三分之一。。。懵了,才发现计算速度是越来越慢,一开始还想着是不是该用并行了(虽然现在并行还不会用,相当于死循环),仔细又研究了一下,是数据读取越来越慢的问题。回头一想,是不是应该用分块读取了。说到分块读取,第一个想到的又是pandas的chunksize,一开始还不会用,想清楚之后才觉得恍然大悟。
以下列出3个思路:
pandas:在读取csv,或者数据库读取csv的时候有个chunksize的选项,可以设置每块的大小,我的程序里,每121条数据一个读取次,一天24个121条,一年365个24的121条,一般每次就是读取24*121的块,然后需要将每块又做一个循环。没有具体实现过,我估计这个封包的对于末尾的数据比较方便,里面应该有if条件。
postgresql:
df_tables = pd.read_sql_query("select * from mxndata3;",con=conn)#
在读取csv的时候将query的*改为121*24,然后for循环。
numpy:
这就是这次代码的具体实现步骤了:
'''
#臭氧的克里金插值,先idw插值
import numpy as np
import matplotlib.pyplot as plt
import os
import gdal, osr
import pandas as pd
import test_idw
import multiprocessing
conn=psycopg2.connect(database="postgres",user="postgres",password="1234",host="127.0.0.1",port="5432")
df_tables = pd.read_sql_query("select * from mxndata3;",con=conn)#
#pplisttemp=3744
for ij in range(156,366):
df_arr=np.array(df_tables[ij*24*121:(ij 1)*24*121])
for ii in range(24):
o3hour=np.array(df_arr[ii:(ii 1)*121])
ds = gdal.Open(r'D:/minxinan/grid/rastermxn1km.tif')
bandg = ds.GetRasterBand(1)
elevationg = bandg.ReadAsArray()
[cols, rows] = elevationg.shape
format = "GTiff"#5
driver = gdal.GetDriverByName(format)#6
listpm1=[]
for j in range(len(o3hour)):
if o3hour[j,9]!=999999:
listpm1.append(o3hour[j])
listpm1=np.array(listpm1).reshape(len(listpm1),35)
xlist=[]
ylist=[]
for i in range(323):
for j in range(401):
xlist.append(i 1)
ylist.append(j 1)
xlist=np.array(xlist)
np.array(ylist.reverse())
xyarray=np.column_stack((xlist,ylist))
xo3,yo3=listpm1[:,31],listpm1[:,32]
listo3xy=np.column_stack((yo3,xo3))
idw_tree = test_idw.tree(listo3xy, listpm1[:,9])
pre = idw_tree(xyarray)
pr=pre.reshape(323,401)
pe=np.transpose(pr)[::-1][:,::-1][:,::-1]###转置转置
##转置之后可以把数据恢复到正确的位置
outDataRaster = driver.Create(r'D:/minxinan/o3idw1/' str(ij*24 ii) '.tif', rows, cols, 1, gdal.GDT_Int16)
outDataRaster.SetGeoTransform(ds.GetGeoTransform())
outDataRaster.SetProjection(ds.GetProjection())
outDataRaster.GetRasterBand(1).WriteArray(pe)
outDataRaster.FlushCache()
del outDataRaster
正确运行!