小技巧-分块操作-python-pandas-numpy-postgresql

2020-09-15 12:24:01 浏览数 (1)

昨天晚上信心满满的把代码运行,预计大概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

正确运行!

0 人点赞