iotdb-ai 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,8 @@
1
+ include README.md
2
+ include QUICKSTART.md
3
+ include ARCHITECTURE.md
4
+ include LICENSE
5
+ include requirements.txt
6
+ recursive-include examples *.py
7
+ recursive-include tests *.py
8
+
@@ -0,0 +1,424 @@
1
+ Metadata-Version: 2.4
2
+ Name: iotdb-ai
3
+ Version: 0.1.0
4
+ Summary: IoTDB AI Toolkit - High-performance time series machine learning toolkit
5
+ Home-page: https://github.com/ycycse/IoTDB-AI
6
+ Author: ycycse
7
+ Author-email: dev@iotdb.apache.org
8
+ Classifier: Development Status :: 3 - Alpha
9
+ Classifier: Intended Audience :: Developers
10
+ Classifier: Intended Audience :: Science/Research
11
+ Classifier: License :: OSI Approved :: Apache Software License
12
+ Classifier: Programming Language :: Python :: 3
13
+ Classifier: Programming Language :: Python :: 3.7
14
+ Classifier: Programming Language :: Python :: 3.8
15
+ Classifier: Programming Language :: Python :: 3.9
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
19
+ Requires-Python: >=3.7
20
+ Description-Content-Type: text/markdown
21
+ Requires-Dist: torch>=1.7.0
22
+ Requires-Dist: numpy>=1.19.0
23
+ Requires-Dist: tsfile>=2.2.1
24
+ Provides-Extra: dev
25
+ Requires-Dist: pytest>=6.0; extra == "dev"
26
+ Requires-Dist: black>=21.0; extra == "dev"
27
+ Requires-Dist: flake8>=3.9; extra == "dev"
28
+ Provides-Extra: iotdb
29
+ Requires-Dist: apache-iotdb>=1.0.0; extra == "iotdb"
30
+ Dynamic: author
31
+ Dynamic: author-email
32
+ Dynamic: classifier
33
+ Dynamic: description
34
+ Dynamic: description-content-type
35
+ Dynamic: home-page
36
+ Dynamic: provides-extra
37
+ Dynamic: requires-dist
38
+ Dynamic: requires-python
39
+ Dynamic: summary
40
+
41
+ # IoTDB AI Toolkit
42
+
43
+ 高性能时间序列机器学习工具包,为 IoTDB 和时间序列分析提供强大的 AI/ML 支持。
44
+
45
+ ## 🚀 特性
46
+
47
+ ### TsFileDataset - 高性能 PyTorch 数据集
48
+
49
+ 直接从 TsFile 文件读取数据用于深度学习模型训练,无需运行 IoTDB 服务器。
50
+
51
+ **核心优势:**
52
+ - 🔥 **高性能**:O(log n) 索引查找,使用官方 tsfile 包优化读取
53
+ - 💾 **内存高效**:支持懒加载和预加载两种模式
54
+ - 🎯 **简洁易用**:最少的参数配置,开箱即用
55
+ - 🔧 **独立部署**:不依赖 IoTDB 服务器运行
56
+ - 📦 **多文件支持**:自动处理多个 TsFile 文件
57
+ - ✨ **官方支持**:使用 Apache TsFile 官方 Python 包,兼容性最佳
58
+
59
+ ### TsFileDataFrame - 懒加载时序数据分析视图
60
+
61
+ 对多个 TsFile 文件提供统一的 DataFrame 式访问接口,支持数组式索引和时间对齐查询。
62
+
63
+ **核心优势:**
64
+ - 📂 **多文件统一视图**:自动合并多个 TsFile 中的同名序列,透明处理跨文件数据
65
+ - ⚡ **懒加载**:仅在查询时读取数据,大幅减少内存占用
66
+ - 🔗 **多文件并行加载**:多文件场景下自动并行读取元数据,加速初始化
67
+ - 🎯 **灵活索引**:支持按序号、名称、切片、列表等多种方式访问序列
68
+ - 📊 **时间对齐查询**:通过 `.loc` 实现多序列时间对齐,自动填充 NaN
69
+ - 🖨️ **友好展示**:内置格式化打印,支持截断展示和全量展示
70
+
71
+ ## 📦 安装
72
+
73
+ ```bash
74
+ # 从源码安装
75
+ git clone https://github.com/your-repo/IoTDB-AI.git
76
+ cd IoTDB-AI
77
+ pip install -e .
78
+
79
+ # 或者使用 pip(如果已发布)
80
+ pip install iotdb-ai
81
+ ```
82
+
83
+ **依赖说明:**
84
+ - `torch>=1.7.0` - PyTorch 深度学习框架
85
+ - `numpy>=1.19.0` - 数值计算库
86
+ - `tsfile>=2.0.0` - Apache TsFile 官方 Python 包(自动安装)
87
+
88
+ ## 🎯 快速开始
89
+
90
+ ### 基本使用
91
+
92
+ ```python
93
+ from iotdb_ai import TsFileDataset
94
+ from torch.utils.data import DataLoader
95
+
96
+ # 创建数据集
97
+ dataset = TsFileDataset(
98
+ tsfile_paths="data/sensor_data.tsfile", # 单个文件或文件列表
99
+ seq_len=96, # 输入序列长度(lookback window)
100
+ pred_len=24, # 预测长度(forecast horizon)
101
+ window_stride=1 # 滑动窗口步长(默认1)
102
+ )
103
+
104
+ # 使用 PyTorch DataLoader
105
+ dataloader = DataLoader(
106
+ dataset,
107
+ batch_size=32,
108
+ shuffle=True,
109
+ num_workers=4
110
+ )
111
+
112
+ # 训练模型
113
+ for input_seq, target_seq in dataloader:
114
+ # input_seq: (batch_size, seq_len)
115
+ # target_seq: (batch_size, pred_len)
116
+ ...
117
+ ```
118
+
119
+ ### 多文件支持
120
+
121
+ ```python
122
+ # 同时处理多个 TsFile 文件
123
+ dataset = TsFileDataset(
124
+ tsfile_paths=[
125
+ "data/2024-01.tsfile",
126
+ "data/2024-02.tsfile",
127
+ "data/2024-03.tsfile",
128
+ ],
129
+ seq_len=168, # 一周数据
130
+ pred_len=24, # 预测未来一天
131
+ )
132
+ ```
133
+
134
+ ### 预加载模式(小数据集)
135
+
136
+ ```python
137
+ # 内存充足时,一次性加载所有数据获得最佳性能
138
+ dataset = TsFileDataset(
139
+ tsfile_paths="data/small_dataset.tsfile",
140
+ seq_len=96,
141
+ pred_len=24,
142
+ preload=True # 启用预加载
143
+ )
144
+ ```
145
+
146
+ ## 📊 性能优化
147
+
148
+ ### 推荐配置
149
+
150
+ 根据数据集大小选择合适的配置:
151
+
152
+ | 数据集大小 | 推荐配置 | 说明 |
153
+ |-----------|---------|------|
154
+ | < 1GB | `preload=True` | 全部加载到内存,极速访问 |
155
+ | 1-10GB | `num_workers=4-8` | 多进程懒加载,平衡性能和内存 |
156
+ | > 10GB | `window_stride=8+` | 增大步长减少样本数 |
157
+
158
+ ### DataLoader 优化
159
+
160
+ ```python
161
+ dataloader = DataLoader(
162
+ dataset,
163
+ batch_size=32,
164
+ shuffle=True,
165
+ num_workers=4, # 多进程并行加载
166
+ pin_memory=True, # 加速 GPU 传输
167
+ persistent_workers=True # 保持工作进程
168
+ )
169
+ ```
170
+
171
+ ## 📚 API 文档
172
+
173
+ ### TsFileDataset
174
+
175
+ ```python
176
+ TsFileDataset(
177
+ tsfile_paths: Union[str, List[str]], # TsFile 文件路径
178
+ seq_len: int, # 输入序列长度
179
+ pred_len: int, # 预测序列长度
180
+ window_stride: int = 1, # 滑动窗口步长
181
+ preload: bool = False, # 是否预加载到内存
182
+ )
183
+ ```
184
+
185
+ **方法:**
186
+ - `__len__()`: 返回数据集样本总数
187
+ - `__getitem__(index)`: 获取指定索引的样本
188
+ - `get_series_count()`: 返回时间序列数量
189
+ - `get_info()`: 返回数据集详细信息
190
+
191
+ **返回值:**
192
+ - `(input_seq, target_seq)` 元组
193
+ - `input_seq`: torch.Tensor, shape `(seq_len,)`
194
+ - `target_seq`: torch.Tensor, shape `(pred_len,)`
195
+
196
+ ### TsFileDataFrame
197
+
198
+ ```python
199
+ TsFileDataFrame(
200
+ paths: Union[str, List[str]], # TsFile 文件路径、路径列表或目录路径
201
+ show_progress: bool = True, # 是否显示加载进度
202
+ )
203
+ ```
204
+
205
+ **属性:**
206
+ - `timeseries` -> `List[dict]`: 所有序列的元信息列表,每项包含 `ts_name`、`start_time`、`end_time`、`count`
207
+ - `loc` -> `_LocIndexer`: 时间对齐查询索引器
208
+
209
+ **方法:**
210
+ - `__len__()`: 返回序列总数
211
+ - `__getitem__(key)`: 按索引(int)、名称(str)、切片(slice)或列表(list)访问序列
212
+ - `list_timeseries(path_prefix="")`: 按前缀过滤序列名称
213
+ - `close()`: 关闭所有底层文件句柄
214
+ - 支持 `with` 上下文管理器
215
+
216
+ ### Timeseries
217
+
218
+ 由 `TsFileDataFrame[...]` 返回的单条时间序列对象。
219
+
220
+ **属性:**
221
+ - `name` -> `str`: 序列完整路径
222
+ - `timestamps` -> `np.ndarray`: 毫秒时间戳数组
223
+ - `stats` -> `dict`: 包含 `start_time`、`end_time`、`count`
224
+
225
+ **方法:**
226
+ - `__len__()`: 返回数据点数量
227
+ - `__getitem__(key)`: 行索引访问,支持 `ts[20]`(单值)和 `ts[20:100]`(切片,返回 np.ndarray)
228
+
229
+ ### AlignedTimeseries
230
+
231
+ 由 `.loc[...]` 返回的时间对齐查询结果。
232
+
233
+ **属性:**
234
+ - `timestamps` -> `np.ndarray`: 对齐后的毫秒时间戳
235
+ - `values` -> `np.ndarray`: shape `(rows, cols)` 的值矩阵,缺失值为 NaN
236
+ - `series_names` -> `List[str]`: 列对应的序列名称
237
+ - `shape` -> `tuple`: values 的形状
238
+
239
+ **方法:**
240
+ - `__len__()`: 返回行数
241
+ - `__getitem__(key)`: 索引访问 values,支持 `result[i]` 和 `result[i, j]`
242
+ - `show(max_rows=None)`: 格式化打印表格,可指定最大行数
243
+
244
+ ### TsFileDataFrame 使用
245
+
246
+ #### 基本使用
247
+
248
+ ```python
249
+ from iotdb_ai import TsFileDataFrame
250
+
251
+ # 从单个文件创建
252
+ df = TsFileDataFrame("data/sensor_data.tsfile")
253
+
254
+ # 从多个文件创建(同名序列自动合并)
255
+ df = TsFileDataFrame([
256
+ "data/2024-01.tsfile",
257
+ "data/2024-02.tsfile",
258
+ ])
259
+
260
+ # 从目录创建(自动扫描目录下所有 .tsfile 文件)
261
+ df = TsFileDataFrame("data/")
262
+
263
+ # 查看概览
264
+ print(df)
265
+ # TsFileDataFrame(5 time series, 2 files)
266
+ # ts_name start_time end_time count
267
+ # 0 weather.Beijing.temperature 2024-01-01 00:00:00 2024-06-30 23:00:00 4344
268
+ # 1 weather.Beijing.humidity 2024-01-01 00:00:00 2024-06-30 23:00:00 4344
269
+ # ...
270
+ ```
271
+
272
+ #### 访问单条时间序列
273
+
274
+ ```python
275
+ # 按索引访问
276
+ ts = df[0] # 第一条序列
277
+ ts = df[-1] # 最后一条序列
278
+
279
+ # 按名称访问
280
+ ts = df['weather.Beijing.humidity']
281
+
282
+ # 查看序列信息
283
+ print(ts) # Timeseries('weather.Beijing.humidity', count=4344, ...)
284
+ print(len(ts)) # 4344
285
+ print(ts.stats) # {'start_time': ..., 'end_time': ..., 'count': 4344}
286
+
287
+ # 行索引访问数据
288
+ val = ts[0] # 第一个值
289
+ vals = ts[100:200] # 第 100~199 行的值(返回 np.ndarray)
290
+ ```
291
+
292
+ #### 批量访问序列
293
+
294
+ ```python
295
+ # 切片
296
+ series_list = df[1:3] # 返回 List[Timeseries]
297
+
298
+ # 列表索引
299
+ series_list = df[[0, 2, 4]] # 返回 List[Timeseries]
300
+
301
+ # 列出满足前缀的序列名
302
+ names = df.list_timeseries("weather.Beijing")
303
+ ```
304
+
305
+ #### 时间对齐查询 (.loc)
306
+
307
+ ```python
308
+ # 按时间范围 + 序列名查询,返回 AlignedTimeseries
309
+ result = df.loc[
310
+ 1704067200000:1704153600000, # 时间范围(毫秒时间戳)
311
+ ['weather.Beijing.temperature',
312
+ 'weather.Beijing.humidity']
313
+ ]
314
+
315
+ # 也支持按序列索引号
316
+ result = df.loc[1704067200000:1704153600000, [0, 1]]
317
+
318
+ print(result)
319
+ # AlignedTimeseries(24 rows, 2 series)
320
+ # timestamp weather.Beijing.temperature weather.Beijing.humidity
321
+ # 2024-01-01 00:00:00 -2.50 45.00
322
+ # 2024-01-01 01:00:00 -3.10 47.20
323
+ # ...
324
+
325
+ # 访问底层数据
326
+ result.timestamps # np.ndarray, 毫秒时间戳
327
+ result.values # np.ndarray, shape (rows, cols)
328
+ result.series_names # ['weather.Beijing.temperature', 'weather.Beijing.humidity']
329
+ result[0] # 第一行所有列的值
330
+ result[0, 1] # 第一行第二列的值
331
+
332
+ # 控制显示行数
333
+ result.show() # 显示全部行
334
+ result.show(50) # 显示前 50 行
335
+ ```
336
+
337
+ #### 上下文管理器
338
+
339
+ ```python
340
+ with TsFileDataFrame("data/sensor_data.tsfile") as df:
341
+ ts = df[0]
342
+ vals = ts[:100]
343
+ # 自动关闭文件句柄
344
+ ```
345
+
346
+ ## 🎓 示例
347
+
348
+ 查看 `examples/` 目录获取更多示例:
349
+
350
+ - `tsfile_basic_usage.py` - 基本使用方法
351
+ - 更多示例即将推出...
352
+
353
+ ## 🏗️ 架构设计
354
+
355
+ ### 核心组件
356
+
357
+ 1. **TsFileDataset** (`iotdb_ai/tsfile/dataset.py`)
358
+ - 主数据集类,实现 PyTorch Dataset 接口
359
+ - 高效的索引结构(二分查找 + 前缀和)
360
+ - 支持懒加载和预加载模式
361
+
362
+ 2. **TsFileDataFrame** (`iotdb_ai/tsfile/dataframe.py`)
363
+ - 多文件统一视图,DataFrame 式访问接口
364
+ - 时间对齐查询(`.loc`),自动填充 NaN
365
+ - 跨文件同名序列自动合并
366
+
367
+ 3. **TsFileReader** (`iotdb_ai/tsfile/reader.py`)
368
+ - 底层 TsFile 读取器
369
+ - 双模式:快速解析 + IoTDB 官方库回退
370
+ - 优化的批量读取
371
+
372
+ ### 性能特性
373
+
374
+ - **O(log n) 查找**:使用二分查找快速定位时间序列
375
+ - **批量读取**:一次读取完整序列,减少 I/O 次数
376
+ - **多进程支持**:与 PyTorch DataLoader 无缝集成
377
+ - **内存优化**:按需加载,可选预加载
378
+
379
+ ## 🔧 开发
380
+
381
+ ### 安装开发依赖
382
+
383
+ ```bash
384
+ pip install -e ".[dev]"
385
+ ```
386
+
387
+ ### 运行测试
388
+
389
+ ```bash
390
+ pytest tests/ -v
391
+ ```
392
+
393
+ ### 代码格式化
394
+
395
+ ```bash
396
+ black iotdb_ai/
397
+ flake8 iotdb_ai/
398
+ ```
399
+
400
+ ## 📝 未来规划
401
+
402
+ - [x] 多变量时间序列支持
403
+ - [x] 时间范围过滤
404
+ - [x] 序列名称/模式过滤
405
+ - [ ] 数据增强功能
406
+ - [ ] 更多预训练模型
407
+ - [ ] 分布式训练支持
408
+
409
+ ## 🤝 贡献
410
+
411
+ 欢迎提交 Issue 和 Pull Request!
412
+
413
+ ## 📄 License
414
+
415
+ Apache License 2.0
416
+
417
+ ## 📮 联系
418
+
419
+ - 项目主页: https://iotdb.apache.org/
420
+ - 问题反馈: [GitHub Issues](https://github.com/apache/iotdb/issues)
421
+
422
+ ---
423
+
424
+ **注意:** 这是一个早期版本,API 可能会有变化。欢迎反馈和建议!
@@ -0,0 +1,281 @@
1
+ # IoTDB AI - 快速入门指南
2
+
3
+ 本指南将帮助你快速开始使用 IoTDB AI Toolkit 进行时间序列模型训练。
4
+
5
+ ## 前置要求
6
+
7
+ - Python >= 3.7
8
+ - PyTorch >= 1.7.0
9
+ - NumPy >= 1.19.0
10
+
11
+ ## 安装
12
+
13
+ ```bash
14
+ cd IoTDB-AI
15
+ pip install -e .
16
+ ```
17
+
18
+ ## 准备数据
19
+
20
+ ### 方式1:从 IoTDB 导出 TsFile
21
+
22
+ 如果你已经有 IoTDB 实例运行:
23
+
24
+ ```bash
25
+ # 使用 IoTDB CLI 导出数据
26
+ ./sbin/export-tsfile.sh -h 127.0.0.1 -p 6667 -u root -pw root \
27
+ -s "root.sg1.**" -t "2024-01-01" -e "2024-12-31" -o "data.tsfile"
28
+ ```
29
+
30
+ ### 方式2:使用已有的 TsFile 文件
31
+
32
+ 如果你已经有 TsFile 文件,可以直接使用。
33
+
34
+ ## 第一个例子
35
+
36
+ 创建 `train.py`:
37
+
38
+ ```python
39
+ import torch
40
+ import torch.nn as nn
41
+ from torch.utils.data import DataLoader
42
+ from iotdb_ai import TsFileDataset
43
+
44
+ # 1. 创建数据集
45
+ dataset = TsFileDataset(
46
+ tsfile_paths="data.tsfile",
47
+ seq_len=96, # 使用过去96个时间点
48
+ pred_len=24, # 预测未来24个时间点
49
+ window_stride=1 # 每次移动1个时间点
50
+ )
51
+
52
+ print(f"数据集信息: {dataset.get_info()}")
53
+
54
+ # 2. 创建 DataLoader
55
+ train_loader = DataLoader(
56
+ dataset,
57
+ batch_size=32,
58
+ shuffle=True,
59
+ num_workers=4
60
+ )
61
+
62
+ # 3. 定义一个简单的模型
63
+ class SimpleForecaster(nn.Module):
64
+ def __init__(self, seq_len, pred_len, hidden_size=128):
65
+ super().__init__()
66
+ self.lstm = nn.LSTM(1, hidden_size, batch_first=True)
67
+ self.linear = nn.Linear(hidden_size, pred_len)
68
+
69
+ def forward(self, x):
70
+ # x shape: (batch, seq_len)
71
+ x = x.unsqueeze(-1) # (batch, seq_len, 1)
72
+ out, _ = self.lstm(x)
73
+ out = out[:, -1, :] # 取最后一个时间步
74
+ pred = self.linear(out)
75
+ return pred
76
+
77
+ model = SimpleForecaster(seq_len=96, pred_len=24)
78
+ criterion = nn.MSELoss()
79
+ optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
80
+
81
+ # 4. 训练循环
82
+ print("开始训练...")
83
+ for epoch in range(10):
84
+ total_loss = 0
85
+ for batch_idx, (inputs, targets) in enumerate(train_loader):
86
+ # 前向传播
87
+ outputs = model(inputs)
88
+ loss = criterion(outputs, targets)
89
+
90
+ # 反向传播
91
+ optimizer.zero_grad()
92
+ loss.backward()
93
+ optimizer.step()
94
+
95
+ total_loss += loss.item()
96
+
97
+ avg_loss = total_loss / len(train_loader)
98
+ print(f"Epoch {epoch+1}/10, Loss: {avg_loss:.4f}")
99
+
100
+ print("训练完成!")
101
+
102
+ # 5. 保存模型
103
+ torch.save(model.state_dict(), "forecaster.pth")
104
+ ```
105
+
106
+ 运行:
107
+
108
+ ```bash
109
+ python train.py
110
+ ```
111
+
112
+ ## 常见使用场景
113
+
114
+ ### 场景1:长序列预测
115
+
116
+ ```python
117
+ # 使用7天数据预测未来1天
118
+ dataset = TsFileDataset(
119
+ tsfile_paths="data.tsfile",
120
+ seq_len=168, # 7天 * 24小时
121
+ pred_len=24, # 1天
122
+ window_stride=24 # 每次跳过1天,减少样本重叠
123
+ )
124
+ ```
125
+
126
+ ### 场景2:多文件训练
127
+
128
+ ```python
129
+ # 训练集使用多个月份的数据
130
+ dataset = TsFileDataset(
131
+ tsfile_paths=[
132
+ "data/2024-01.tsfile",
133
+ "data/2024-02.tsfile",
134
+ "data/2024-03.tsfile",
135
+ ],
136
+ seq_len=96,
137
+ pred_len=24,
138
+ )
139
+ ```
140
+
141
+ ### 场景3:小数据集快速训练
142
+
143
+ ```python
144
+ # 小数据集全部加载到内存
145
+ dataset = TsFileDataset(
146
+ tsfile_paths="data.tsfile",
147
+ seq_len=96,
148
+ pred_len=24,
149
+ preload=True # 关键:预加载
150
+ )
151
+
152
+ # 可以使用更多 workers
153
+ dataloader = DataLoader(dataset, batch_size=32, num_workers=8)
154
+ ```
155
+
156
+ ### 场景4:GPU 训练优化
157
+
158
+ ```python
159
+ # GPU 训练配置
160
+ device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
161
+ model = model.to(device)
162
+
163
+ dataloader = DataLoader(
164
+ dataset,
165
+ batch_size=64,
166
+ shuffle=True,
167
+ num_workers=4,
168
+ pin_memory=True, # 关键:加速 GPU 传输
169
+ persistent_workers=True
170
+ )
171
+
172
+ for inputs, targets in dataloader:
173
+ inputs = inputs.to(device)
174
+ targets = targets.to(device)
175
+ # ... 训练代码
176
+ ```
177
+
178
+ ## 性能调优
179
+
180
+ ### 1. 选择合适的 batch_size
181
+
182
+ ```python
183
+ # 测试不同的 batch_size
184
+ for batch_size in [16, 32, 64, 128]:
185
+ dataloader = DataLoader(dataset, batch_size=batch_size)
186
+ # 测试训练速度
187
+ ```
188
+
189
+ ### 2. 调整 num_workers
190
+
191
+ ```python
192
+ # CPU 核心数的 2-4 倍通常效果最好
193
+ import multiprocessing
194
+ optimal_workers = min(multiprocessing.cpu_count() * 2, 8)
195
+
196
+ dataloader = DataLoader(dataset, num_workers=optimal_workers)
197
+ ```
198
+
199
+ ### 3. 使用合适的 window_stride
200
+
201
+ ```python
202
+ # 大数据集:增大 stride 减少样本数
203
+ dataset = TsFileDataset(
204
+ tsfile_paths="large_data.tsfile",
205
+ seq_len=96,
206
+ pred_len=24,
207
+ window_stride=8 # 每次跳8个点
208
+ )
209
+ ```
210
+
211
+ ## 常见问题
212
+
213
+ ### Q1: 找不到 TsFile 文件
214
+
215
+ **A:** 确保文件路径正确,使用绝对路径或相对于运行目录的路径。
216
+
217
+ ```python
218
+ import os
219
+ file_path = os.path.abspath("data.tsfile")
220
+ dataset = TsFileDataset(tsfile_paths=file_path, ...)
221
+ ```
222
+
223
+ ### Q2: 内存不足
224
+
225
+ **A:** 使用懒加载模式(默认),不要设置 `preload=True`。
226
+
227
+ ```python
228
+ # 默认懒加载,内存占用小
229
+ dataset = TsFileDataset(
230
+ tsfile_paths="data.tsfile",
231
+ seq_len=96,
232
+ pred_len=24,
233
+ window_stride=8 # 增大步长也可以减少内存
234
+ )
235
+ ```
236
+
237
+ ### Q3: 训练速度慢
238
+
239
+ **A:** 尝试以下优化:
240
+
241
+ 1. 增加 `num_workers`
242
+ 2. 使用 `pin_memory=True`(GPU训练)
243
+ 3. 增大 `batch_size`
244
+ 4. 小数据集使用 `preload=True`
245
+
246
+ ```python
247
+ dataloader = DataLoader(
248
+ dataset,
249
+ batch_size=64, # 增大
250
+ num_workers=8, # 增大
251
+ pin_memory=True, # GPU加速
252
+ persistent_workers=True
253
+ )
254
+ ```
255
+
256
+ ### Q4: 如何查看数据集信息
257
+
258
+ **A:** 使用 `get_info()` 方法:
259
+
260
+ ```python
261
+ dataset = TsFileDataset(...)
262
+ info = dataset.get_info()
263
+ print(f"时间序列数: {info['series_count']}")
264
+ print(f"总样本数: {info['total_windows']}")
265
+ print(f"文件列表: {info['files']}")
266
+ ```
267
+
268
+ ## 下一步
269
+
270
+ - 查看 `examples/` 目录获取更多示例
271
+ - 阅读 API 文档了解详细参数
272
+ - 参考架构文档理解实现细节
273
+
274
+ ## 获取帮助
275
+
276
+ - 查看 [README.md](README.md) 了解更多功能
277
+ - 提交 Issue: https://github.com/apache/iotdb/issues
278
+ - 访问社区: https://iotdb.apache.org/
279
+
280
+ 祝你使用愉快!🚀
281
+