Swift v25.2.10版本中FlatBuffers序列化大量数据后内存占用无法回落的问题求助
Swift v25.2.10版本中FlatBuffers序列化大量数据后内存占用无法回落的问题求助
我最近在iOS/macOS项目里用FlatBuffers处理大批量数据时遇到了棘手的内存问题,折腾了好几天没找到解决办法,来求助大家!
问题场景
我需要序列化一个包含100万条ACC对象的数组,使用的是FlatBuffers 25.2.10版本。序列化完成后,应用的内存直接飙升到387MB左右,关键是这部分内存完全不会归还给系统:我已经释放了所有和FlatBufferBuilder、序列化数据相关的引用,也主动调用了FlatBufferBuilder.clear()方法,但内存占用就是纹丝不动。
最小复现代码
以下是核心的序列化逻辑(包含测试数据生成):
// 基础数据结构 struct ACC { let reqId: String let msTime: Double let nsTimestamp: Double let x: Double let y: Double let z: Double } // 生成测试数据 var accs: [ACC] = [] accs.reserveCapacity(1_000_000) for i in 0..<1_000_000 { accs.append(ACC(reqId: "id\(i)", msTime: Double(i), nsTimestamp: Double(i), x: Double(i), y: Double(i), z: Double(i))) } // FlatBuffers序列化逻辑 var b = FlatBufferBuilder() var offsets = [Offset]() offsets.reserveCapacity(accs.count) for acc in accs { let reqId = b.create(string: acc.reqId) let start = FBACC.startFBACC(&b) FBACC.add(reqId: reqId, &b) FBACC.add(msTime: Int64(acc.msTime), &b) FBACC.add(nsTimestamp: Int64(acc.nsTimestamp), &b) FBACC.add(x: acc.x, &b) FBACC.add(y: acc.y, &b) FBACC.add(z: acc.z, &b) let end = FBACC.endFBACC(&b, start: start) offsets.append(end) } let vector = b.createVector(ofOffsets: offsets) let accsOffset = FBACCs.createFBACCs(&b, accsVectorOffset: vector) b.finish(offset: accsOffset) let result = b.data b.clear() print("FlatBuffer result size: \(result.count) bytes")
复现步骤
- 将上述代码集成到iOS/macOS项目中(可绑定到按钮点击事件触发)
- 通过Xcode内存调试工具或系统活动监视器观察内存变化
我观察到的现象
- 序列化过程中内存快速上涨,完成后稳定在387MB左右
- 调用
b.clear()、将accs/offsets/result等变量置为nil后,内存无任何下降 - 手动触发系统内存压力测试,这部分内存也不会被系统回收
预期结果
- 序列化完成并清理资源后,内存应回落至序列化前的水平
- 至少存在某种方式能强制FlatBuffers将占用的内存归还给系统
已尝试的解决方法
我试了多种方案,但均未奏效:
- 显式将所有相关变量(
accs、offsets、result、b)置为nil - 将整个序列化逻辑包裹在
autoreleasepool { ... }中,提前触发自动释放池回收 - 调用
b.clear()后重新初始化FlatBufferBuilder - 通过分配/释放其他大缓冲区尝试触发系统内存回收
环境信息
- FlatBuffers Swift版本:25.2.10
- 开发环境:Xcode,目标平台iOS/macOS
我的疑问
- 这是FlatBuffers的设计限制、Swift绑定的bug,还是底层内存分配器的问题?
- 有没有办法让FlatBuffers在序列化完成后,将占用的内存归还给系统?
- 是不是我的序列化逻辑存在问题,导致了隐性的内存泄漏?
真心希望各位大佬能给点思路或解决方案,非常感谢!
内容来源于stack exchange
相关产品推荐
相关产品推荐

