如何使用Python的asammdf库最小化MDF文件大小
问题描述
我有一个数据记录仪生成的2.4MB MDF文件,包含100多个不同采样率的时间序列通道,数据类型涵盖float、int和str,每个通道的数据类型统一。用Python的asammdf库加载后转成DataFrame,再从DataFrame创建MDF对象保存为.mf4文件时,输出文件居然达到74.8MB,是原文件的31倍。
想找最佳实践:在不降低采样率的前提下,生成体积最小的文件;同时处理字符串通道——这类通道的数据完全相同,每个只需保存单个值。原代码如下:
import pandas as pd import numpy as np from asammdf import MDF, Signal # Load mdf file into dataframe mdf_file_path = "C:\Users\user\Desktop\input.mdf" mdf_obj = MDF(mdf_file_path) df_from_input_mdf = mdf_obj.to_dataframe() # Create MDF from dataframe new_mdf_from_df = MDF() for column in df_from_input_mdf.columns: sig = Signal( samples=df_from_input_mdf[column].values, timestamps=df_from_input_mdf.index.values, name=column, ) try: new_mdf_from_df.append(sig) except Exception as e: print(f"Error occurred while appending signal for column '{column}': {e}") # Save new mdf to file new_mdf_output_path = f"C:\Users\user\Desktop\output.mdf" new_mdf_from_df.save(new_mdf_output_path)
优化方案
- 别用DataFrame中转:转成DataFrame时,所有通道会被强制对齐到最高采样率的时间戳,低采样率通道被插值填充大量冗余数据,这是体积暴涨的核心原因。直接操作原MDF的信号对象,保留每个通道的原始采样率和数据,避免冗余。
- 优化字符串通道存储:如果字符串通道的所有值完全相同,只保留1个采样点+对应1个时间戳(比如取第一个时间点),无需存储全量重复数据。
- 明确指定数据类型:创建Signal时显式传入原信号的
datatype参数,防止asammdf自动推断为更占空间的类型(比如把int转成float)。 - 启用压缩保存:调用
save方法时开启MF4内置压缩,推荐用zlib或lz4格式,进一步缩小文件体积。
修改后的代码
import numpy as np from asammdf import MDF, Signal # 加载原始MDF文件,跳过DataFrame中转步骤 mdf_file_path = r"C:\Users\user\Desktop\input.mdf" mdf_obj = MDF(mdf_file_path) new_mdf = MDF() for sig in mdf_obj.signals: # 处理值完全相同的字符串通道 if sig.datatype_str.startswith('string'): # 检查所有采样是否一致 if np.all(sig.samples == sig.samples[0]): # 创建仅含单个采样和时间戳的信号 optimized_sig = Signal( samples=np.array([sig.samples[0]]), timestamps=np.array([sig.timestamps[0]]), name=sig.name, datatype=sig.datatype, unit=sig.unit, comment=sig.comment ) new_mdf.append(optimized_sig) continue # 非字符串通道直接复用原始信号,保留原采样率和数据类型 new_mdf.append(sig) # 保存为MF4格式并启用zlib压缩 new_mdf_output_path = r"C:\Users\user\Desktop\output.mf4" new_mdf.save(new_mdf_output_path, format='mf4', compression='zlib')
内容的提问来源于stack exchange,提问作者jB777
相关产品推荐
相关产品推荐

