taohan10200 / cra5 /api /utils.py
multimodalart's picture
multimodalart HF Staff
Add CRA5 ERA5 decompression demo
ec6cfc7 verified
Raw
History Blame Contribute Delete
1.68 kB
import struct
from pathlib import Path
def filesize(filepath: str) -> int:
if not Path(filepath).is_file():
raise ValueError(f'Invalid file "{filepath}".')
return Path(filepath).stat().st_size
def write_uints(fd, values, fmt=">{:d}I"):
fd.write(struct.pack(fmt.format(len(values)), *values))
return len(values) * 4
def write_bytes(fd, values, fmt=">{:d}s"):
if len(values) == 0:
return
fd.write(struct.pack(fmt.format(len(values)), values))
return len(values) * 1
def read_uints(fd, n, fmt=">{:d}I"):
sz = struct.calcsize("I")
return struct.unpack(fmt.format(n), fd.read(n * sz))
def read_uchars(fd, n, fmt=">{:d}B"):
sz = struct.calcsize("B")
return struct.unpack(fmt.format(n), fd.read(n * sz))
def read_bytes(fd, n, fmt=">{:d}s"):
sz = struct.calcsize("s")
return struct.unpack(fmt.format(n), fd.read(n * sz))[0]
def save_binary_code(self, time, output):
year = time.split('-')[0]
file_url=f'{year}/{time}.bin'
with Path(file_url).open("wb") as f:
out_strings = output["strings"]
shape = output["z_shape"]
bytes_cnt = 0
bytes_cnt = write_uints(f, (shape[0], shape[1], len(out_strings)))
for s in out_strings:
# import pdb
# pdb.set_trace()
print(len(s))
bytes_cnt += write_uints(f, (len(s),))
bytes_cnt += write_bytes(f, s)
# return bytes_cnt
# self.s3_client.upload_file('/tmp/tmp.bin', object_name=file_url)
size = filesize('/tmp/tmp.bin')
bpp = float(size) * 8 / ( out["x_shape"][1]*out["x_shape"][2]*out["x_shape"][3])
print(bpp)