numpy 用python写一个大的netCDF4文件

dw1jzc5e  于 2023-04-30  发布在  Python
关注(0)|答案(3)|浏览(131)

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

Killed.

无论如何,对数据的子部分执行此操作,很明显,在2,560,000条记录和5,120,000条记录之间的某处,代码没有足够的内存,必须开始交换。当然,性能大大降低。两个问题:1)有人知道如何使这项工作更有效吗?我正在考虑的一件事是以某种方式将数据的子部分增量地放入,而不是一次完成。有人知道怎么做吗?2)我假设“已杀死”消息发生在内存最终耗尽时,但我不知道。有人能解释一下吗?
谢谢。
附录:netCDF4提供了这个问题的答案,你可以在我给出的我自己的问题的答案中看到。所以现在,我可以向前看了。但还有一个问题netCDF4的答案不适用于netCDF3,而且netCDF3还没有消失。有谁知道如何在netCDF3框架中解决这个问题?再次感谢。

mspsb9vt

mspsb9vt1#

如果没有看到代码,很难判断你在做什么,但是你可以尝试使用sync命令,在一些数据被写入文件后,将内存中的数据刷新到磁盘:
http://netcdf4-python.googlecode.com/svn/trunk/docs/netCDF4.Dataset-class.html

zd287kbt

zd287kbt2#

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

mklgxw1f

mklgxw1f3#

下面的解决方案可以创建大小超过2 GB的文件。但是,您不能读取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()

相关问题