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

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")

复现步骤

  1. 将上述代码集成到iOS/macOS项目中(可绑定到按钮点击事件触发)
  2. 通过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

我的疑问

  1. 这是FlatBuffers的设计限制、Swift绑定的bug,还是底层内存分配器的问题?
  2. 有没有办法让FlatBuffers在序列化完成后,将占用的内存归还给系统?
  3. 是不是我的序列化逻辑存在问题,导致了隐性的内存泄漏?

真心希望各位大佬能给点思路或解决方案,非常感谢!


内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 12:08:07