File io 写一个netcdf4文件比写一个netcdf3_经典文件慢6倍,这个文件是8倍大?

File io 写一个netcdf4文件比写一个netcdf3_经典文件慢6倍,这个文件是8倍大?,file-io,netcdf,File Io,Netcdf,我正在使用python中的netCDF4库,刚刚遇到了标题中所述的问题。起初我把这归咎于团体,但事实证明这是NETCDF4和NETCDF3_经典格式之间的区别(编辑:它似乎与我们Linux安装的netcdf库有关) 在下面的程序中,我以两种不同的方式创建了一个简单的时间序列netcdf文件:1)作为NETCDF3_经典文件,2)作为NETCDF4平面文件(在NETCDF4文件中创建组没有多大区别)。通过简单的计时和ls命令,我发现: 1) NETCDF3 1.3483 seco

我正在使用python中的netCDF4库,刚刚遇到了标题中所述的问题。起初我把这归咎于团体,但事实证明这是NETCDF4和NETCDF3_经典格式之间的区别(编辑:它似乎与我们Linux安装的netcdf库有关)

在下面的程序中,我以两种不同的方式创建了一个简单的时间序列netcdf文件:1)作为NETCDF3_经典文件,2)作为NETCDF4平面文件(在NETCDF4文件中创建组没有多大区别)。通过简单的计时和ls命令,我发现:

1) NETCDF3          1.3483 seconds      1922704 bytes
2) NETCDF4 flat     8.5920 seconds     15178689 bytes
它与创建1)和2)的例程完全相同,唯一的区别是netCDF4.Dataset方法中的format参数。这是一个bug还是一个特性

谢谢,马丁

编辑:我现在发现这一定与我们在Linux计算机上本地安装netcdf库有关。当我在我的Windows笔记本电脑上使用下面的程序版本(精简到基本版本)时,我得到了相似的文件大小,而netcdf4的速度实际上几乎是netcdf3的2倍!当我在linux系统上运行相同的程序时,我可以重现旧的结果。因此,这个问题显然与python无关

很抱歉给你带来了困惑

新代码:

import datetime as dt
import numpy as np
import netCDF4 as nc


def write_to_netcdf_single(filename, data, series_info, format='NETCDF4'):
    vname = 'testvar'
    t0 = dt.datetime.now()
    with nc.Dataset(filename, "w", format=format) as f:
        # define dimensions and variables
        dim = f.createDimension('time', None)
        time = f.createVariable('time', 'f8', ('time',))
        time.units = "days since 1900-01-01 00:00:00"
        time.calendar = "gregorian"
        param = f.createVariable(vname, 'f4', ('time',))
        param.units = "kg"
        # define global attributes
        for k, v in sorted(series_info.items()):
            setattr(f, k, v)
        # store data values
        time[:] = nc.date2num(data.time, units=time.units, calendar=time.calendar)
        param[:] = data.value
    t1 = dt.datetime.now()
    print "Writing file %s took %10.4f seconds." % (filename, (t1-t0).total_seconds())


if __name__ == "__main__":
    # create an array with 1 mio values and datetime instances
    time = np.array([dt.datetime(2000,1,1)+dt.timedelta(hours=v) for v in range(1000000)])
    values = np.arange(0., 1000000.)
    data = np.array(zip(time, values), dtype=[('time', dt.datetime), ('value', 'f4')])                                                                                       
    data = data.view(np.recarray)
    series_info = {'attr1':'dummy', 'attr2':'dummy2'}
    filename = "testnc4.nc"
    write_to_netcdf_single(filename, data, series_info)
    filename = "testnc3.nc"
    write_to_netcdf_single(filename, data, series_info, format='NETCDF3_CLASSIC')

[旧代码被删除,因为它有太多不必要的内容]

这两种文件格式确实有不同的特点。经典的文件格式非常简单(好吧,比新的格式更简单:):一个小标题描述了所有数据,然后(因为您有3个记录变量)3个记录变量被交错

很好,很简单,但您只得到一个无限维,没有用于并行I/O的工具,也没有将数据管理到组中的方法

输入NetCDF-4中引入的新的基于HDF5的后端

为了获得新功能、更大的灵活性以及更少的文件和可变大小限制,您必须付出一些代价。对于大型数据集,成本是摊销的,但您的变量(相对而言)有点小

我认为使用记录变量会加剧文件大小的差异。为了支持可在N维中扩展的阵列,有更多的元数据与Netcdf-4格式的每个记录条目相关联


HDF5也使用“读卡器使正确”的约定。经典的NetCDF表示“所有数据都将是big-endian”,但HDF5编码了一些关于数据存储方式的信息。如果读卡器进程与写卡器进程的体系结构相同(这是常见的,就像在笔记本电脑上一样,或者如果从模拟检查点重新启动),那么就不需要进行转换。

这个问题不太可能对其他人有所帮助,因为它似乎是一个与netcdf库和python netCDF4模块之间的相互作用相关的特定于站点的问题

我可以看到这一点,但我仍然对这里发生的事情感到困惑。特别是,当我试图将程序精简到基本部分以便每个人都可以运行它时,我现在得到了相反的结果。上面编辑的代码对于netcdf3返回4秒,对于netcdf4版本返回2.5秒。文件大小大致相同。因此,我的原始代码中肯定还有其他东西……所以您几乎改变了一切:您的代码更简单,您的操作系统不同,并且相关的软件堆栈无疑配置不同。windows是否可以更好地缓存hdf5访问?或者它公开了一个文件系统块大小,这真的降低了串行netcdf的速度?