การเพิ่มการบีบอัดไฟล์ NetCDF โดยใช้ xarray
ฉันมีแรสเตอร์ที่ฉันพยายามบีบอัดและแปลงเป็นNetCDFรูปแบบที่มีระดับการบีบอัด = 9 โดยใช้xarrayแพ็คเกจ ฉันคิดว่ามีการเพิ่มการบีบอัดโดยใช้พารามิเตอร์การเข้ารหัสเป็นคำสั่ง แต่ฉันไม่ค่อยแน่ใจว่าฉันเข้าใจสิ่งที่จะเพิ่มได้อย่างไรที่นี่:
f = directory + "/D_Passaic_F02_NBR_E0001_WGS84_comp"
t = xarray.open_rasterio(f)
encode = {'zlib': True, 'complevel': 9}
t.to_netcdf(output_dir+"/Test2.nc", encoding=encode)
โดยทั่วไปฉันได้รับข้อผิดพลาด: KeyError: 'zlib'แต่ฉันไม่แน่ใจว่าควรใช้อะไรที่นี่ ข้อเสนอแนะ? อาร์เรย์ข้อมูลแสดงแถบเดียวและตัวแปร x และ y ดังนี้:
<xarray.DataArray (band: 1, y: 9635, x: 14564)>
or, in more detail:
<bound method ImplementsArrayReduce._reduce_method.<locals>.wrapped_func of
<xarray.DataArray (band: 1, y: 9635, x: 14564)>
[140324140 values with dtype=float32]
Coordinates:
* band (band) int32 1
* y (y) float64 41.06 41.06 41.06 41.06 ... 40.74 40.74 40.74 40.74
* x (x) float64 -74.45 -74.45 -74.45 -74.45 ... -73.97 -73.97 -73.97
Attributes:
transform: (3.2670488250568696e-05, 0.0, -74.447024371179...
crs: +init=epsg:4326
res: (3.2670488250568696e-05, 3.2670488250568696e-05)
is_tiled: 1
nodatavals: (-9999.0,)
scales: (1.0,)
offsets: (0.0,)
AREA_OR_POINT: Area
HISTOGRAM: 9090|9307|9097|9209|8729|8864|8744|8864|9181|9...
TIFFTAG_ARTIST: HEC-RAS
TIFFTAG_IMAGEDESCRIPTION: Depth (Max)>
คำตอบ
คำแนะนำข้อผิดพลาดที่ xarray พยายามค้นหาตัวแปรที่เรียกว่า "zlib" ในข้อมูลของคุณ โครงสร้างที่ถูกต้องสำหรับการเข้ารหัส dict จะเป็นดังนี้:
encode = {"precipitation": {'zlib': True, ...}}
แต่เนื่องจากวิธีการโหลดข้อมูลจึงยุ่งยาก
สิ่งที่คุณต้องหลังจากที่โหลดไฟล์โดยใช้เป็นopen_rasterio DataArrayA DataArrayไม่มีโครงสร้างที่มีตัวแปร เมื่อเขียนถึง NetCDF ข้อมูลของคุณจะต้องเป็นDataSetไฟล์.
หากคุณเรียกto_netcdfใช้ a DataArrayระบบจะสร้างDataSetตัวแปรสำหรับข้อมูลที่เรียกว่า " __xarray_dataarray_variable__" โดยอัตโนมัติ ดังนั้นสิ่งนี้จะใช้งานได้ แต่ไฟล์ที่ได้จะน่าเกลียดด้วยชื่อแบบนั้น ... :
encode = {"__xarray_dataarray_variable__": {'zlib': True, ...}} # yuck!
เมื่อคุณสร้างชุดข้อมูลด้วยตนเองคุณสามารถระบุชื่อตัวแปรได้ ตัวอย่างเช่นหากวงดนตรีของคุณมีข้อมูล DEM สิ่งนี้อาจสมเหตุสมผล:
dem = t.to_dataset(name="dem")
หลังจากนั้นคุณสามารถระบุคำสั่งการเข้ารหัสสำหรับสิ่งนั้นและมีชื่อที่สมเหตุสมผลในผลลัพธ์:
encoding = {"dem": {'zlib': True, ...}}
dem.to_netcdf("dem.nc", encoding=encoding)
น่าเศร้าที่การบีบอัดด้วย xarray นั้นทำให้ RAM หิวมากระวังงานที่คุณไม่ได้บันทึกไว้ก่อนที่จะเรียกใช้ในกรณีที่ OOM ของระบบ
อ้างอิง:
- https://xarray.pydata.org/en/stable/generated/xarray.open_rasterio.html
- https://xarray.pydata.org/en/stable/generated/xarray.DataArray.to_netcdf.html#xarray.DataArray.to_netcdf
- https://xarray.pydata.org/en/stable/generated/xarray.Dataset.to_netcdf.html