使用PyKrige运行泛克里金代码时遭遇MemoryError内存不足问题求助
问题
我是Python新手,尝试运行PyKrige库中的UniversalKriging(泛克里金)代码时出现内存错误。
代码
os.chdir("E:\\18_Jupyter") os.getcwd() !pip install pykrige import matplotlib.pyplot as plt import numpy as np import pandas as pd from pykrige.uk import UniversalKriging sss = pd.read_csv('try1.csv') sss.head() x = sss.iloc[:,0] y = sss.iloc[:,1] z = sss.iloc[:,2] gridx = np.arange(0,14,0.125) gridy = np.arange(95,126,0.125) UK = UniversalKriging( x, y, z, variogram_model="linear", drift_terms=["regional_linear"], )
报错信息
MemoryError Traceback (most recent call last) ~\AppData\Local\Temp\ipykernel_23672\3274456448.py in <module> ----> 1 UK = UniversalKriging( 2 x, 3 y, 4 z, 5 variogram_model="linear", MemoryError: Unable to allocate 7.59 GiB for an array with shape (1018651816,) and data type float64
解决方案
内存错误源于克里金计算需构建N×N的协方差矩阵(N为样本点数量),样本量过大时矩阵内存占用会呈指数级增长。以下是可行解决办法:
精简样本数据:若
try1.csv样本量极大(如超10万条),可对数据降采样。比如用pandas随机抽取部分样本,或按空间网格聚合取均值:# 随机抽取50%样本,固定随机种子保证可复现 sss_sampled = sss.sample(frac=0.5, random_state=42) x = sss_sampled.iloc[:,0] y = sss_sampled.iloc[:,1] z = sss_sampled.iloc[:,2]降低插值网格分辨率:当前
gridx和gridy步长0.125会生成大量网格点,增大步长可减少目标插值点数量:gridx = np.arange(0,14,0.25) gridy = np.arange(95,126,0.25)关闭PyKrige冗余功能:UniversalKriging默认开启绘图和verbose日志,关闭这些可减少内存开销:
UK = UniversalKriging( x, y, z, variogram_model="linear", drift_terms=["regional_linear"], enable_plotting=False, verbose=False )使用分块克里金:若需保留全部样本,可采用分块克里金,将研究区域拆分后分别计算再拼接结果。PyKrige的
BlockKriging类支持该模式,适配大样本场景。升级系统环境:确保使用64位Python(32位版本内存上限仅约4GB),必要时增加物理内存。
内容的提问来源于stack exchange,提问作者zam
相关产品推荐
相关产品推荐

