csv到netCDF生成的.nc文件比原始.csv大4倍

问题描述 投票:0回答:2

我有许多大型.csv文件,我想使用xrray转换为.nc(即netCDF文件)。但是,我发现保存.nc文件需要很长时间,并且生成的.nc文件比原始.csv文件大得多(大4倍到12倍)。

下面是示例代码,用于显示相同数据如何生成大小比.csv中保存的文件大4倍的.nc文件

import pandas as pd
import xarray as xr
import numpy as np
import os

# Create pandas DataFrame 
df = pd.DataFrame(np.random.randint(low=0, high=10, size=(100000,5)),
                   columns=['a', 'b', 'c', 'd', 'e'])

# Make 'e' a column of strings
df['e'] = df['e'].astype(str)

# Save to csv
df.to_csv('df.csv')

# Convert to an xarray's Dataset
ds = xr.Dataset.from_dataframe(df)

# Save NetCDF file
ds.to_netcdf('ds.nc')

# Compute stats
stats1 = os.stat('df.csv')
stats2 = os.stat('ds.nc')
print('csv=',str(stats1.st_size))
print('nc =',str(stats2.st_size))
print('nc/csv=',str(stats2.st_size/stats1.st_size))

结果:

>>> csv = 1688902 bytes
>>>  nc = 6432441 bytes
>>> nc/csv = 3.8086526038811015

如您所见,.nc文件大约是.csv文件的4倍。

我发现this post建议从类型'string'更改为'char'类型会大大减少文件大小,但是如何在xarray中执行此操作?

另请注意,即使将所有数据作为整数(即​​注释掉df['e'] = df['e'].astype(str)),生成的.nc文件仍然比.csv大50%

我错过了压缩设置吗? ...或者是其他东西?

python csv netcdf python-xarray netcdf4
2个回答
2
投票

我找到了自己问题的答案......

  1. 为每个变量启用压缩
  2. 对于e列,请指定dtype为“character”(即S1

在保存.nc文件之前,请添加以下代码:

encoding = {'a':{'zlib':True},
            'b':{'zlib':True},
            'c':{'zlib':True},
            'd':{'zlib':True},
            'e':{'zlib':True, 'dtype':'S1'}}
ds.to_netcdf('ds.nc',format='NETCDF4',engine='netcdf4',encoding=encoding)

新的结果是:

>>> csv = 1688902 bytes
>>>  nc = 1066182 bytes
>>> nc/csv = 0.6312870729029867

请注意,保存.nc文件仍需要一些时间。


1
投票

由于您只使用0到9之间的变量,因此在CSV文件中,1个字节足以存储数据。 xarray,对于整数,每个默认值使用int64(8个字节)。

要告诉xarray使用1字节整数,您可以使用:

 ds.to_netcdf('ds2.nc',encoding = {'a':{'dtype': 'int8'},
      'b':{'dtype': 'int8'}, 'c':{'dtype': 'int8'}, 
      'd':{'dtype': 'int8'}, 'e':{'dtype': 'S1'}})

生成的文件是1307618字节。压缩将减少文件大小,尤其是对于非随机数据:-)

© www.soinside.com 2019 - 2024. All rights reserved.