Python 3.x Python NetCDF4库RAM的使用
我很难理解Python netCDF4库在从文件读取数据时如何处理数据存储。看起来RAM中几乎没有加载任何内容。下面是一个代码示例:Python 3.x Python NetCDF4库RAM的使用,python-3.x,memory,netcdf,Python 3.x,Memory,Netcdf,我很难理解Python netCDF4库在从文件读取数据时如何处理数据存储。看起来RAM中几乎没有加载任何内容。下面是一个代码示例: import os from netCDF4 import Dataset os.popen('free -m').readlines() # Used memory: 37615 MB my_ncd = Dataset("my.nc", "r+") os.popen('free -m').readlines() # Used memory: 37620
import os
from netCDF4 import Dataset
os.popen('free -m').readlines() # Used memory: 37615 MB
my_ncd = Dataset("my.nc", "r+")
os.popen('free -m').readlines() # Used memory: 37620 MB
Dataset对象占用5 MB的RAM,这让我很难堪,因为my.nc文件大小是997 MB。Dataset对象只是帮助访问硬盘上数据的索引,还是我在模块文档中遗漏了一些明显的内容?如果您使用python-m memory_profiler运行以下代码,那么您可以看到实际发生的情况,使用您自己的大小合理的nc文件。数据未加载到内存的原因是,这正是基于HDF5开发的HDF5或NetCDF4等文件格式的原因:用于处理大型复杂数据集。HDF5文件可以包含TB-s数据和数千个变量
import sys
from netCDF4 import Dataset
@profile
def openthis(infile, invar):
ff = Dataset(infile)
abc = ff.variables[invar][:]
if __name__ == "__main__":
file_name = sys.argv[1]
variable_name = sys.argv[2]
openthis(file_name, variable_name)
在调用类似my_ncd.variables['var'][:]的东西之前,数据实际上不会被读取。请注意,即使MyOnCD.Value[VaR ]不会显著增加内存使用量,但直到[]部分,数据才真正被读取。考虑如果打开一个20GB大小的NETCDF4文件,它会被加载到内存中会发生什么?还考虑到磁盘中的文件是压缩的,而内存中的文件通常不是压缩的?我认为@Bart answer非常清楚,在访问数据之前不会读取数据。只需打开文件,您就可以访问metada,也就是说,您可以看到文件中有哪些变量、维度等。这是我编写的一个非常快速的脏脚本,但它完美地再现了您在内存使用方面的预期:@Bart感谢您的脚本。输出应为mem=~76 MB,used=77 MB。检查之后,我想我把变量的大小搞砸了。我现在了解了NetCDF的工作原理。谢谢你的努力!:-现在我知道变量是动态加载的。谢谢你的帮助!:-D