请求拆分大于7MB的MF4文件以解决转换时内存不足问题
解决MF4大文件内存不足问题及拆分方法
可以拆分大于7MB的MF4文件为多个小文件,同时也可以通过流式处理避免一次性加载整个文件到内存,从根源解决内存报错问题。
一、直接拆分MF4文件
如果必须拆分为7MB左右的文件,推荐使用asammdf库(MF4文件处理的常用工具),以下是具体步骤:
- 安装依赖:
pip install asammdf - 编写拆分脚本:
注意:这种按时间比例拆分的方式会保证每个分片大小接近7MB,同时保留完整的信号结构。from asammdf import MDF import os def split_mf4(input_path, chunk_size_mb=7): mdf = MDF(input_path) # 计算总字节数和每个分片的字节数 total_size = os.path.getsize(input_path) chunk_size = chunk_size_mb * 1024 * 1024 # 按时间轴拆分(MF4按时间存储,拆分更合理) total_duration = mdf.last_time - mdf.first_time chunk_duration = (total_duration * chunk_size) / total_size current_time = mdf.first_time chunk_index = 1 while current_time < mdf.last_time: end_time = min(current_time + chunk_duration, mdf.last_time) # 提取时间片段内的数据 chunk_mdf = mdf.filter_time([current_time, end_time]) # 保存分片文件 output_path = f"{os.path.splitext(input_path)[0]}_chunk_{chunk_index}.mf4" chunk_mdf.save(output_path, overwrite=True) current_time = end_time chunk_index += 1 # 调用拆分函数 split_mf4("your_large_file.mf4", chunk_size_mb=7)
二、流式处理避免内存占用
如果不需要拆分文件,也可以通过逐块读取处理的方式避免一次性加载整个文件到内存:
from asammdf import MDF mdf = MDF("your_large_file.mf4") # 按批次读取信号数据 for batch in mdf.iterate_channels(chunksize=10000): # 在这里处理当前批次的数据,比如转换格式 process_batch(batch)
这种方式每次只加载一小部分数据到内存,从根源解决Unable to allocate...的内存报错。
三、报错原因补充
你遇到的Unable to allocate 123. MiB for an array with shape (3570125,) and data type |S36错误,是因为工具尝试一次性将整个MF4文件的字符串类型信号加载到内存,当文件过大时超出了可用内存上限。拆分或流式处理都能有效规避这个问题。
内容的提问来源于stack exchange,提问作者Lyes S
相关产品推荐
相关产品推荐

