导入大型数据文件的有效方法,Python

导入大型数据文件的有效方法,Python,python,arrays,macos,memory,netcdf,Python,Arrays,Macos,Memory,Netcdf,我正在从事一个项目,该项目从两个NetCDF文件中获取数据,每个文件的大小为521.8MB。诚然,这些文件相当大。我正在开发一款MacBookPro,它有4GB的内存,但是这台电脑已经有4年的历史了。代码是用Python编写的 这些文件包含了地球上一年的天气数据。它是一个4D数组,包含时间(长度1460)、高度(长度17)、纬度(长度73)和经度(长度144)。我一次只需要这些信息的某些部分。具体来说,我需要所有的时间,但只需要一个海拔高度,以及一个特定的经纬度区域(20x44) 我有从两个文件

我正在从事一个项目,该项目从两个NetCDF文件中获取数据,每个文件的大小为521.8MB。诚然,这些文件相当大。我正在开发一款MacBookPro,它有4GB的内存,但是这台电脑已经有4年的历史了。代码是用Python编写的

这些文件包含了地球上一年的天气数据。它是一个4D数组,包含时间(长度1460)、高度(长度17)、纬度(长度73)和经度(长度144)。我一次只需要这些信息的某些部分。具体来说,我需要所有的时间,但只需要一个海拔高度,以及一个特定的经纬度区域(20x44)

我有从两个文件收集所有这些数据的代码,只识别我需要的数据,执行计算,并将数据输出到文本文件中。这一年完成后,它循环了63年的数据,即126个同等大小的文件。现在,代码说它在进程开始时就耗尽了内存。相关代码似乎是:

from mpl_toolkits.basemap.pupynere import NetCDFFile

#Create the file name for the input data.
ufile="Flow/uwnd."+str(time)+".nc"
vfile="Flow/vwnd."+str(time)+".nc"

#Get the data from that particular file.
uu=NetCDFFile(ufile)
vv=NetCDFFile(vfile)

#Save the values into an array (will be 4-dimentional)
uwnd_short=uu.variables['uwnd'][:]
vwnd_short=vv.variables['vwnd'][:]
因此,第一部分创建NetCDF文件的名称。第二部分从NetCDF文件中获取所有数据。第三部分获取导入的数据并将其放入4D数组中。(这可能不是技术上的数组,因为Python是如何处理数据的,但是我已经想到了,因为我的C++背景。对于缺乏适当的词汇的道歉。)之后,我把我需要的特定数据从4D数组中分离出来,并执行必要的计算。问题是,这以前可以工作,但现在我的计算机在
vv=NetCDFFile(vfile)
行上工作时内存不足


某个地方可能有内存泄漏吗?有没有办法只获取我需要的特定范围的数据,这样我就不会带进整个文件?有没有一种更有效的方法可以从导入数据到整理我需要的数据部分,然后用它执行计算?

您可能需要做的是使用nccopy重新整理文件,然后处理块,因为有些变量看起来太大,无法放入内存。或者获取更多内存(或虚拟内存)


nccopy文档就在这里

值得一提的是,我的计算机上的数据太多了,内存不足。我让外置硬盘正常工作,并删除了一堆文件。然后,我终于想出了如何使用ncgen、ncdump等。我能够从每个大文件中只获取所需的数据,并创建一个新文件,其中只包含该数据。这将我的NetCDF文件从500MB减少到5MB。这也使代码的运行速度更快。

如果可能的话,请提供您正在导入的文件中的几行示例数据。当我导入一个文件,将其保存到数组中,然后输出数组时,我得到以下结果:
[[[[4.10000610e+00 4.50001526e+00 4.80000305e+00…,2.90000916e+00 3.3000035E+00 3.70001221e+00][3.00001526e+00 3.50001526e+00 3.90000916e+00…,1.6000060E+00 2.10000610e+00 2.50001526e+00][-9.9998441E-01-6.9996948E-01-3.9993896E-01…,-1.499974E+00-1.399990E]…,
数字当然会继续,后来我使用了刻度和偏移量。由于我最终计算出了ncdump,输出结果如下:-16146,-16176,-16226,-16306,-16436,-16616,-16836,-17056,-17286,-17506,-17706,-17866,-17976,-18016,-17996,-17916,-17776,-17566,-17306,-17016,-16746,-16526,-16416,-16496,-16606,-16726,“否则将获得更多内存”-即使我们假设没有足够的内存用于此操作,也不意味着程序会崩溃。这不是页面文件和/交换的目的吗?我不确定我是否理解重新调整正在做什么。原始文件中的四个维度的长度是1464、17、73和144。我尝试将其重新调整为1464、17、50,和50,新文件为750 MB(原始文件为522 MB)。当我将其重新调整为1464、17、20和20时,新文件为637 MB。这对我来说似乎不是更小或更高效。我缺少什么吗?我经常使用
ncks
将超实验室全局文件划分为纬度带,以实现高效的内存读/写。