You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 14:28:14