Python 3.x 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

我很难理解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 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