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

如何在Apache IoTDB的同一毫秒插入多条时间序列数据?需关注数据结构吗?

关于Apache IoTDB同一毫秒插入多条时间序列数据的实现方案

一、同一毫秒内插入多条数据的直接实现方式

IoTDB原生支持同一毫秒时间戳的多数据插入,核心是利用批量插入接口,以下是两种常用场景的实现方式:

  • 使用insertRecords接口:适合多设备、同时间戳的场景。构造包含相同毫秒级时间戳的多条记录,一次性提交即可。示例代码:
Session session = new Session("127.0.0.1", 6667, "root", "root");
session.open();
long targetMs = System.currentTimeMillis();
// 多设备、多测点的同时间戳数据
List<String> deviceIds = Arrays.asList("root.factory.device1", "root.factory.device2");
List<List<String>> measurements = Arrays.asList(
    Arrays.asList("temperature", "humidity"),
    Arrays.asList("voltage", "current")
);
List<List<Object>> values = Arrays.asList(
    Arrays.asList(24.5f, 58),
    Arrays.asList(220.1, 1.2)
);
// 所有记录使用同一毫秒时间戳
List<Long> timestamps = Arrays.asList(targetMs, targetMs);

session.insertRecords(deviceIds, timestamps, measurements, values);
session.close();
  • 使用insertTablet接口:适合单设备、同时间戳下多测点的场景,这种方式存储和插入效率更高,因为IoTDB会将同设备同时间戳的测点数据作为一个连续数据块处理。示例代码:
Session session = new Session("127.0.0.1", 6667, "root", "root");
session.open();
long targetMs = System.currentTimeMillis();
String deviceId = "root.factory.device1";
List<String> measurements = Arrays.asList("temperature", "humidity", "pressure");
List<TSDataType> types = Arrays.asList(TSDataType.FLOAT, TSDataType.INT32, TSDataType.DOUBLE);

// 创建Tablet,指定初始行数为1
Tablet tablet = new Tablet(deviceId, measurements, types, 1);
int rowIdx = tablet.rowSize++;
tablet.addTimestamp(rowIdx, targetMs);
tablet.addValue("temperature", rowIdx, 24.8f);
tablet.addValue("humidity", rowIdx, 59);
tablet.addValue("pressure", rowIdx, 101.3);

session.insertTablet(tablet);
session.close();

二、数据结构设计的关键考量

要高效实现同一毫秒插入,数据结构设计是核心前提:

  • 存储组划分:把同一毫秒内有数据产生的设备归到同一个存储组下。IoTDB会将同存储组的数据写入同一批文件,减少磁盘寻址和IO次数,大幅提升批量插入效率。
  • 测点规划:如果某些测点总是在同一毫秒同步产生数据,不要将它们拆分到不同设备下,尽量放在同一设备的多个测点中,这样可以最大化利用insertTablet的高效批量处理能力。
  • 数据类型统一:同一测点的数据类型必须保持一致,避免插入时的类型转换开销;同设备的测点尽量选择对齐的数据类型,优化内存中数据块的存储结构。

三、提升插入效率的调整建议

除了实现方式和结构设计,还可以通过参数调整进一步优化性能:

  • 开启批量插入:将同一毫秒的多条数据收集到一定数量后再提交,减少网络交互次数。可以通过session.setBatchSize(1000)设置批量大小,根据实际场景灵活调整。
  • 调整存储组相关参数:修改iotdb-engine.properties中的配置:
    • 调大wal_buffer_size:增加WAL缓冲区大小,减少刷盘频率,适配批量插入场景;
    • 调整group_size_in_byte:根据批量数据的大小设置存储组文件的阈值,避免频繁生成新文件。
  • 关闭不必要的校验:如果能确保插入数据的合法性,可以将enable_insertion_check设为false,跳过数据校验步骤,降低性能损耗。
  • 使用SessionPool:多线程插入场景下,用SessionPool复用连接,避免频繁创建、销毁Session的开销,提升并发插入的效率。

内容的提问来源于stack exchange,提问作者zai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 20:49:52