首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >小技巧-分块操作-python-pandas-numpy-postgresql

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

作者头像
一个有趣的灵魂W
发布2020-09-15 12:24:01
发布2020-09-15 12:24:01
9400
举报

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

正确运行!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一个有趣的灵魂W 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档