用python编写大型netCDF4文件



我正在尝试将netCDF4包与python一起使用。我摄取了近20mil的数据记录,每个记录28个字节,然后我需要将数据写入netCDF4文件。昨天,我尝试一次完成所有操作,在执行了大约一个小时后,python停止运行代码,并显示了非常有用的错误消息:

Killed.

无论如何,通过对数据的子部分进行处理,很明显,在2560000条记录和5120000条记录之间,代码没有足够的内存,必须开始交换。当然,性能大大降低。所以有两个问题:1) 有人知道如何使这项工作更有效吗?我在想的一件事是以某种方式递增地放入数据的子部分,而不是一次完成。有人知道怎么做吗?2) 我想"被杀"的消息发生在记忆最终耗尽的时候,但我不知道。有人能说明这件事吗?

谢谢。

附录:netCDF4提供了这个问题的答案,你可以在我对自己问题的回答中看到。所以目前,我可以继续前进。但还有一个问题:netCDF4的答案将无法与netCDF3一起使用,而且netCDF3也不会消失。有人知道如何在netCDF3的框架中解决这个问题吗?再次感谢。

如果没有看到代码,很难判断您在做什么,但您可以尝试在向文件中写入一定数量的数据后使用sync命令将内存中的数据刷新到磁盘:

http://netcdf4-python.googlecode.com/svn/trunk/docs/netCDF4.Dataset-class.html

在netCDF4中有一个现成的答案:用指定的"chunksize"声明netCDF4变量。我用了10000,一切都很顺利。正如我在对答案的编辑中所指出的,我也想在netCDF3中找到一种解决这个问题的方法,因为netDF3还远远没有死。

下面的解决方案可以创建大小超过2GB的文件。但是,您无法读取s3存储桶中的netcdf3文件,因此这个答案的用途有限。如果你像下面这样不受时间限制,那么你可以在不破坏内存的情况下按时间步长添加数据。我很想知道"chunksize"解决方案是否可以创建大于2GB的文件。

from netCDF4 import Dataset
data_out = Dataset(new_file, 'w', format='NETCDF3_64BIT_OFFSET')
if dim == 'time':
    time_dim = data_out.createDimension(dim, None)
    len_time = len(tmp)
else:
    new_dim = data_out.createDimension(dim, len(tmp))
    new_var = data_out.createVariable(
        dim, cdf_data.variables[dim].datatype, (dim, ))
    new_var[:] = coord_data  # defined elsewhere
for t in range(len_time):
    new_var[t] = data_per_timestep  # insert your data here
    time_dim[t] = time_value
data_out.close()

最新更新