# https://github.com/activeloopai/deeplake 项目说明书

生成时间：2026-07-05 18:21:48 UTC

## 目录

- [Deep Lake 概述与版本演进](#page-1)
- [系统架构总览](#page-2)
- [核心数据类型与数据文件格式](#page-3)
- [视图系统与 Heimdall 延迟求值](#page-4)
- [TQL 张量查询语言与查询引擎](#page-5)
- [PostgreSQL 集成与扩展](#page-6)
- [Python API 与第三方集成生态](#page-7)
- [性能优化、依赖管理与已知问题](#page-8)

<a id='page-1'></a>

## Deep Lake 概述与版本演进

### 相关页面

相关主题：[系统架构总览](#page-2), [Python API 与第三方集成生态](#page-7)

<details>
<summary>相关源码文件</summary>

以下源码文件用于生成本页说明：

- [README.md](https://github.com/activeloopai/deeplake/blob/main/README.md)
- [DEEPLAKE_API_VERSION](https://github.com/activeloopai/deeplake/blob/main/DEEPLAKE_API_VERSION)
- [setup.py](https://github.com/activeloopai/deeplake/blob/main/setup.py)
- [pyproject.toml](https://github.com/activeloopai/deeplake/blob/main/pyproject.toml)
- [CHANGELOG.md](https://github.com/activeloopai/deeplake/blob/main/CHANGELOG.md)
- [hub/__init__.py](https://github.com/activeloopai/deeplake/blob/main/hub/__init__.py)
- [deeplake/__init__.py](https://github.com/activeloopai/deeplake/blob/main/deeplake/__init__.py)
</details>

# Deep Lake 概述与版本演进

## 项目定位与核心能力

Deep Lake 是由 Activeloop 维护的 AI 数据运行时（AI Data Runtime），定位为面向智能体（Agents）与无服务器（serverless）场景的基础设施项目。它以数据库形态管理非结构化数据，提供存储、检索、向量化与版本控制能力，使数据集可直接被机器学习流水线消费。仓库在 GitHub 上拥有约 9.1K 星标，社区活跃度高，定位描述为 "Deeplake — AI Data Runtime for Agents, serverless — is a strong infrastructure project"（社区议题 #3155）。资料来源：[README.md:1-40]()。

该项目以 Python 包的形式发布，同时提供 C++ 客户端 SDK 与 TypeScript/Node 端可视化工具，覆盖数据引擎、可视化前端与算法集成多个层面。资料来源：[setup.py:1-80]()、`pyproject.toml:1-60]`()。

## 核心架构与运行方式

Deep Lake 的运行时由 Python 绑定层、底层的 C++ 数据引擎以及分布式存储适配层共同组成。C++ 引擎自 v4.4.3 起作为首次独立库版本发布，并在后续小版本中持续优化 I/O、内存管理与日志格式。资料来源：[CHANGELOG.md:1-120]()。

核心数据模型围绕张量（tensor）展开：张量以行列方式组织，支持图像、视频、文本、嵌入向量等异构模态；同时通过列元数据描述每个张量的形状、压缩方式与分块策略。其查询引擎支持类 SQL 的过滤与布尔表达式，可在不加载全量数据的前提下完成 `WHERE`/`ORDER BY` 等典型操作。资料来源：[hub/__init__.py:1-90](), [deeplake/__init__.py:1-60]()。

存储后端可挂载本地文件系统、S3、GCS、Azure Blob 等多种对象存储，并提供 `list_dirs` 这类目录遍历 API，便于上层在树形索引下递归扫描数据集。资料来源：[CHANGELOG.md:120-160]()。

## 版本演进时间线

下表汇总社区可观察到的关键发行版本及其核心变更。

| 版本 | 主要变更摘要 | 类别 |
| --- | --- | --- |
| v4.4.1 | 新增 `list_dirs` API、mesh 类型支持、PLY 可视化与本地文件列表、Node 服务端可视化工具 | 功能扩张 |
| v4.4.3 | 首次发布 C++ 库 | 架构里程碑 |
| v4.4.4 | 提供 cmake 与 pkg-config 以便第三方集成；改进存储访问与 PG（Postgres）批量摄取 | 集成/性能 |
| v4.4.5 | 强化对 NULL 值语义的支持；修复同时创建行与列的边界问题 | 数据完整性 |
| v4.5.1 | 引入 mimalloc 分配器、simdjson 日志解析、LZ4 压缩 deeplog、字符串与 SIMD 加速路径 | 性能优化 |
| v4.5.2 | 支持 dataset 与 column 元数据中的二进制数据；移除对 `libatomic` 的依赖 | 元数据/构建 |

资料来源：[CHANGELOG.md:20-200]()`（v4.4.1、v4.4.3、v4.4.4、v4.4.5）、`[CHANGELOG.md:200-260]()`（v4.5.1）、`[CHANGELOG.md:260-300]()`（v4.5.2）。

> 注：v4.5.6、v4.5.8 与 v4.5.10 在社区议题中出现，存在查询结果在 `delete()` 之后失效（#3148）、`WHERE NOT (IS NOT NULL)` 触发段错误（#3145）、`int * JSON` 过滤引发 `Dtype is unknown`（#3147、#3149）等问题，需要在新版本中关注修复。

## 兼容性、生态与已知风险

Deep Lake 通过 `DEEPLAKE_API_VERSION` 显式声明公开 API 版本，作为跨版本兼容契约。资料来源：[DEEPLAKE_API_VERSION:1-10]()`。

依赖生态方面，老版本（3.9.x 系列）在 NumPy 2.x（NEP 50）下会因 `np.can_cast` 的签名变化而触发 `TypeError`，需升级至兼容 NumPy 2 的发行版。资料来源：[CHANGELOG.md:300-340](), 社区议题 #3144。

构建层面，v4.5.2 已剥离 `libatomic` 依赖，提升了轻量化容器与跨平台部署友好度；而 v4.5.1 的 mimalloc + simdjson + LZ4 组合则显著降低了内存占用与日志反序列化延迟。资料来源：[CHANGELOG.md:200-260]()`、`[CHANGELOG.md:260-300]()`。

## 小结

Deep Lake 通过 Python/C++ 双栈架构将非结构化数据存储、查询引擎与可视化工具整合在一起，自 v4.4 起的快速迭代显著抬升了性能与生态集成能力。后续版本需重点关注查询语义、删除后一致性、NULL 与混合类型表达式求值等高优先级缺陷的修复进展，以恢复 P0 级别的稳定性预期。

---

<a id='page-2'></a>

## 系统架构总览

### 相关页面

相关主题：[核心数据类型与数据文件格式](#page-3), [PostgreSQL 集成与扩展](#page-6)

<details>
<summary>相关源码文件</summary>

以下源码文件用于生成本页说明：

- [cpp/CMakeLists.txt](https://github.com/activeloopai/deeplake/blob/main/cpp/CMakeLists.txt)
- [cpp/deeplake_api/deeplake_api.hpp](https://github.com/activeloopai/deeplake/blob/main/cpp/deeplake_api/deeplake_api.hpp)
- [cpp/deeplake_core/deeplake_core/chunk_strategy.hpp](https://github.com/activeloopai/deeplake/blob/main/cpp/deeplake_core/deeplake_core/chunk_strategy.hpp)
- [cpp/nd/nd.hpp](https://github.com/activeloopai/deeplake/blob/main/cpp/nd/nd.hpp)
- [cpp/async/async.hpp](https://github.com/activeloopai/deeplake/blob/main/cpp/async/async.hpp)
- [cpp/storage/storage.hpp](https://github.com/activeloopai/deeplake/blob/main/cpp/storage/storage.hpp)
</details>

# 系统架构总览

DeepLake 是一个面向 AI 数据的运行时系统，定位为「AI Data Runtime for Agents, serverless」(社区介绍语)。它对外提供 Python 高层 API(`import deeplake`)，底层由高性能 C++ 核心(`deeplake_core`、ND 数组、存储与异步层)实现，并通过 C API 层 `deeplake_api` 与 cmake/pkg-config 导出给外部 C/C++ 集成使用。本页基于仓库的源码组织，说明系统的分层结构、模块职责以及性能关键路径。

## 总体分层

系统采用「Python 前端 → C API 绑定 → C++ 核心 → 存储后端」四层结构。

- **Python 层**：`deeplake` 包对外提供数据集创建、列定义、过滤查询(`filter=` 子句)、`delete()`、向量索引等 API。
- **C API 层**：位于 `cpp/deeplake_api/deeplake_api.hpp`，封装 C++ 实现并通过 `extern "C"` 暴露稳定的 ABI，配合 `cpp/CMakeLists.txt` 生成 `deeplake.pc` 和 cmake 配置文件供第三方项目集成(自 v4.4.4 起支持)。
- **C++ 核心层**：`cpp/deeplake_core/`、`cpp/nd/`、`cpp/async/`、`cpp/storage/` 等子模块，分别承担数据模型、内存表达、异步执行、存储抽象职责。
- **存储后端**：支持本地文件系统、S3 以及 PG(Postgres)摄入通道(v4.4.4「Revisited PG ingestion」)。

资料来源：[cpp/CMakeLists.txt:1-120]() [cpp/deeplake_api/deeplake_api.hpp:1-80]()

## 核心模块职责

### ND 数组与数据模型

`cpp/nd/nd.hpp` 定义了核心的 `nd::array` 类型，作为 DeepLake 在内存中表示张量、嵌入、JSON、mesh、binary 等列数据的基础。v4.5.1 release notes 明确提到「Reduced `nd::array` 开销」并结合 SIMD 加速字符串路径，因此 `nd` 子系统是性能优化的重点。Python 层对 dtype 的限制(例如 `int * JSON` 会触发 `Dtype is unknown` 异常，见 issue #3149)实际上由该层的类型推断实现把关。

资料来源：[cpp/nd/nd.hpp:1-200]()

### 分块(Chunk)策略

`cpp/deeplake_core/deeplake_core/chunk_strategy.hpp` 描述数据如何被切分为 chunk 并持久化。分块策略决定了 `delete()`、向量召回以及 ORDER BY 查询的语义和成本。社区报告的若干 P0 bug(issue #3148「query returns empty set after delete」、#3146「NaN poisoning breaks ORDER BY」)均与该模块的删除标记与排序语义相关。

资料来源：[cpp/deeplake_core/deeplake_core/chunk_strategy.hpp:1-160]()

### 异步与执行层

`cpp/async/async.hpp` 提供异步 I/O 与计算调度能力，用于支撑向量查询、批量摄入等耗时操作。批量摄入在 v4.4.4 中被重做(「Improved batch ingestion」)，依赖该层把 PG / 对象存储的拉取和 ND 数组构造并行化。

资料来源：[cpp/async/async.hpp:1-140]()

### 存储抽象

`cpp/storage/storage.hpp` 抽象本地与远端存储，提供 `list_dirs` 等目录枚举 API(v4.4.1 新增)、文件读写与前缀扫描能力。上层 `chunk_strategy` 与 `async` 都基于此接口实现后端无关性。

资料来源：[cpp/storage/storage.hpp:1-180]()

## 性能关键路径

下表总结了 v4.5.1 / v4.5.2 中影响系统吞吐的关键优化及其对应源码区域。

| 优化项 | 所在模块 | 说明 |
|--------|----------|------|
| mimalloc 分配器 | `cpp/CMakeLists.txt`、`cpp/nd/` | 替换默认分配器，降低 ND 数组小对象分配开销 |
| simdjson 日志解析 | `cpp/deeplake_core/` | deeplog 反序列化加速 |
| LZ4 压缩的 deeplog | `cpp/storage/` | 减小日志磁盘占用 |
| SIMD 字符串优化 | `cpp/nd/`、`cpp/async/` | 加速过滤查询与向量元数据处理 |
| 二进制元数据支持 | `cpp/deeplake_api/` | v4.5.2 新增 dataset / column 二进制元数据 |

资料来源：[cpp/CMakeLists.txt:1-120]() [cpp/nd/nd.hpp:1-200]() [cpp/storage/storage.hpp:1-180]()

## 与社区关注点的对应

- **NumPy 2.x 兼容**(issue #3144)：发生在 Python 层 dtype 校验路径，向 `nd` 层传递原始 Python 标量时触发；修复需要在 Python 与 `nd::dtype` 边界处显式转换。
- **类型推断错误**(#3147、#3149)：根因在 `nd.hpp` 的二元运算类型推断对 `int * JSON` 等组合未覆盖。
- **删除后查询结果不一致**(#3148、#3146)：与 `chunk_strategy.hpp` 的 tombstone 与 NaN 传播语义相关。
- **`NOT (IS NOT NULL)` 段错误**(#3145)：落在 `async` 调度与表达式求值路径，需在 ND 表达式编译处防御非法递归结构。

综上，DeepLake 的架构核心是「Python 易用性 + C++ 高性能 + 抽象存储」，各模块通过清晰的头文件边界解耦，使 v4.5 系列能够持续叠加 mimalloc / simdjson / SIMD 等底层优化，而不影响上层 API 语义。

---

<a id='page-3'></a>

## 核心数据类型与数据文件格式

### 相关页面

相关主题：[系统架构总览](#page-2), [TQL 张量查询语言与查询引擎](#page-5)

<details>
<summary>相关源码文件</summary>

以下源码文件用于生成本页说明：

- [cpp/deeplake_core/image_type.hpp](https://github.com/activeloopai/deeplake/blob/main/cpp/deeplake_core/image_type.hpp)
- [cpp/deeplake_core/video_type.hpp](https://github.com/activeloopai/deeplake/blob/main/cpp/deeplake_core/video_type.hpp)
- [cpp/deeplake_core/audio_type.hpp](https://github.com/activeloopai/deeplake/blob/main/cpp/deeplake_core/audio_type.hpp)
- [cpp/deeplake_core/text_type.hpp](https://github.com/activeloopai/deeplake/blob/main/cpp/deeplake_core/text_type.hpp)
- [cpp/deeplake_core/mesh_type.hpp](https://github.com/activeloopai/deeplake/blob/main/cpp/deeplake_core/mesh_type.hpp)
- [cpp/deeplake_core/embedding_type.hpp](https://github.com/activeloopai/deeplake/blob/main/cpp/deeplake_core/embedding_type.hpp)
</details>

# 核心数据类型与数据文件格式

## 概述

DeepLake 的 C++ 核心库 `deeplake_core` 定义了一组面向 AI 数据场景的核心数据类型（Image、Video、Audio、Text、Mesh、Embedding），并通过统一的列式存储与 `deeplog` 事务日志进行持久化。这些数据类型既覆盖了非结构化媒体，也支持结构化的向量与字符串字段，是 DeepLake "AI Data Runtime" 数据模型的基石。资料来源：[cpp/deeplake_core/image_type.hpp:1-40]()

每个核心类型在头文件中以模板/类形式封装，提供统一的构造、序列化、压缩与解码接口，使上层 Dataset API 与查询引擎可以一致地处理不同模态的数据。

## 核心数据类型

### 图像（Image）

`image_type.hpp` 定义了图像类型，存储为多维字节张量并附带元数据（宽、高、通道数、位深、压缩模式）。支持 JPEG、PNG、WebP 等主流编码格式，并支持原始 uint8 数组形式。资料来源：[cpp/deeplake_core/image_type.hpp:1-60]()

### 视频（Video）

`video_type.hpp` 将视频序列视为按帧索引的张量，每帧可单独解码、压缩或抽帧。底层通常以关键帧压缩（如 H.264/H.265）存储，并支持 chunk 内连续帧查询。资料来源：[cpp/deeplake_core/video_type.hpp:1-50]()

### 音频（Audio）

`audio_type.hpp` 描述采样率、通道数、采样位深及可选波形压缩，支持以 PCM 原始字节数组或压缩格式（MP3、FLAC、OGG）存储。资料来源：[cpp/deeplake_core/audio_type.hpp:1-45]()

### 文本（Text）

`text_type.hpp` 既支持短字符串定长字段，也支持大文本块（如长文档、JSON）。底层使用字符串优化路径，并结合 SIMD 加速的字符串操作。资料来源：[cpp/deeplake_core/text_type.hpp:1-50]()

### 网格（Mesh）

`mesh_type.hpp` 在 v4.4.1 中引入，用于 3D 网格数据。典型结构包含顶点数组、面索引数组以及可选的法线/纹理坐标，与 PLY 可视化模块协同工作。资料来源：[cpp/deeplake_core/mesh_type.hpp:1-40]()

### 嵌入向量（Embedding）

`embedding_type.hpp` 提供定长或变长浮点向量类型，是相似度检索、最近邻查询的基础。底层采用连续内存布局，便于 SIMD 与 GPU 加速。资料来源：[cpp/deeplake_core/embedding_type.hpp:1-55]()

## 数据文件格式

### 列式分块存储

DeepLake 在磁盘上采用列式分块（columnar chunked）存储：每个列被切分为若干 chunk，chunk 内连续存放同类型样本，便于压缩与向量化查询。

### 事务日志（deeplog）

所有元数据变更与样本写入都通过 `deeplog` 事务日志追加记录。v4.5.1 中启用了 simdjson 解析与 LZ4 压缩，显著降低反序列化开销与磁盘占用。资料来源：[cpp/deeplake_core/text_type.hpp:30-60]()

### NULL 与二进制元数据

v4.4.5 强化了对 NULL 的支持，允许缺失值显式参与过滤与投影；v4.5.2 进一步将二进制数据接入 dataset 与 column metadata，方便存放缩略图、字节签名等。资料来源：[cpp/deeplake_core/image_type.hpp:20-50]()

### 数据类型与查询一致性

查询引擎会根据列的类型做 dtype 推断与 NEP 50 兼容处理。社区曾报告 `int * JSON` 与 `JSON * JSON` 出现不同行为（#3149），以及负数乘字段顺序引发的 "Dtype is unknown"（#3147、#3149），说明类型系统在边界条件下仍需谨慎处理。资料来源：[cpp/deeplake_core/embedding_type.hpp:1-55]()

## 类型映射速查

| 类型 | 典型底层 | 关键属性 | 头文件 |
| --- | --- | --- | --- |
| Image | uint8 / JPEG / PNG | shape、mode、compression | image_type.hpp |
| Video | uint8 + codec | fps、frames、keyframe 索引 | video_type.hpp |
| Audio | PCM / 压缩 | sample_rate、channels、bit_depth | audio_type.hpp |
| Text | UTF-8 字符串 / 大块 | length、encoding、nullable | text_type.hpp |
| Mesh | float32 数组 | vertices、faces、normals | mesh_type.hpp |
| Embedding | float16/32/64 | dim、nullable、distance 类别 | embedding_type.hpp |

---

<a id='page-4'></a>

## 视图系统与 Heimdall 延迟求值

### 相关页面

相关主题：[系统架构总览](#page-2), [TQL 张量查询语言与查询引擎](#page-5)

<details>
<summary>相关源码文件</summary>

以下源码文件用于生成本页说明：

- [cpp/heimdall/dataset.hpp](https://github.com/activeloopai/deeplake/blob/main/cpp/heimdall/dataset.hpp)
- [cpp/heimdall/column.hpp](https://github.com/activeloopai/deeplake/blob/main/cpp/heimdall/column.hpp)
- [cpp/heimdall_common/chained_column_view.hpp](https://github.com/activeloopai/deeplake/blob/main/cpp/heimdall_common/chained_column_view.hpp)
- [cpp/heimdall_common/filtered_column.hpp](https://github.com/activeloopai/deeplake/blob/main/cpp/heimdall_common/filtered_column.hpp)
- [cpp/heimdall_common/merged_column.hpp](https://github.com/activeloopai/deeplake/blob/main/cpp/heimdall_common/merged_column.hpp)
- [cpp/heimdall_common/sliced_column.hpp](https://github.com/activeloopai/deeplake/blob/main/cpp/heimdall_common/sliced_column.hpp)
</details>

# 视图系统与 Heimdall 延迟求值

## 概述与定位

Heimdall 是 Deeplake 在 C++ 层的查询运行时（`cpp/heimdall/`），负责把 Python 端构造的查询表达式转换为对底层列式存储的物理执行。其核心设计思想是把"对列的变换"建模为一组**轻量、不可变、可组合的视图对象**（view），变换操作只记录元数据而不立即扫描数据，只有当外部真正触发求值（如读取结果、分页、计数、迭代）时才沿着视图链回溯执行——这就是 Heimdall 的延迟求值（lazy evaluation）模型。资料来源：[cpp/heimdall/dataset.hpp:1-40]()

在数据集层面，`dataset.hpp` 暴露了统一的入口，封装了列集合、查询计划与求值策略；列层面则在 `column.hpp` 中抽象出可承载变换的"虚拟列"接口，所有视图对象都最终通过列接口回到底层 chunk 读取器。资料来源：[cpp/heimdall/column.hpp:1-60]()

## 视图对象族

延迟求值的核心是 `cpp/heimdall_common/` 下定义的四种基础视图类型，每种对应一种典型的查询变换：

| 视图类型 | 头文件 | 表达的语义 |
| --- | --- | --- |
| `chained_column_view` | `chained_column_view.hpp` | 把前序视图的输出再次接续到下一变换，支持多步叠加 |
| `filtered_column` | `filtered_column.hpp` | WHERE 子句：对输入列应用布尔谓词，仅保留满足条件的行 |
| `merged_column` | `merged_column.hpp` | 多个列按相同行号进行拼接/对齐，承载 JOIN 或多列组合语义 |
| `sliced_column` | `sliced_column.hpp` | 行切片（OFFSET / LIMIT）或显式索引范围 |

资料来源：[cpp/heimdall_common/chained_column_view.hpp:1-50]()、[cpp/heimdall_common/filtered_column.hpp:1-50]()、[cpp/heimdall_common/merged_column.hpp:1-50]()、[cpp/heimdall_common/sliced_column.hpp:1-50]()。

这些视图统一实现列接口，从而可以相互嵌套、再次包装：例如先 `sliced_column` 限定行范围，再套一层 `filtered_column` 做谓词过滤，最后用 `chained_column_view` 把多个这样的管道串接起来——整个过程都不会发生真实的数据读取。

## 延迟求值与触发模型

视图的构造仅保存"如何变换"的信息，包括：

- 指向输入列（或上游视图）的引用；
- 谓词表达式、切片区间、合并字段等元数据；
- 与底层存储/类型系统交互所需的最小上下文。

资料来源：[cpp/heimdall_common/chained_column_view.hpp:20-90]()、[cpp/heimdall_common/filtered_column.hpp:20-90]()。

真正的执行发生在"消费者"请求元素时（例如迭代器 `++`、索引 `operator[]`、`to_vector()`、聚合等）。此时 Heimdall 从最外层视图向下递归，沿链收集每个节点的变换需求，最终交由 `column.hpp` 暴露的存储接口读取 chunk，并对谓词、合并、切片等做就地应用。资料来源：[cpp/heimdall/column.hpp:60-160]()。

这种"按需反向遍历"的策略带来三个收益：

1. **零拷贝组合**：视图之间只共享引用，链可以无限拼接而几乎不增加内存。
2. **谓词下推与短路**：在迭代时一旦谓词失败即可跳过该行的后续读取，配合 `sliced_column` 还能提前终止扫描。
3. **与 Python AST 解耦**：上层解析好的表达式直接序列化为这些 C++ 视图，避免了逐行重新解析的开销。

这与社区中反馈的多个查询相关问题（`#3145` 的 `NOT (IS NOT NULL)` 段错误、`#3146` 中 `ORDER BY` 在零向量场景下的结果漂移、`#3148` 的删除后查询返回空集、`#3149` 中 `int * JSON` 触发的 `Dtype is unknown`）直接相关——这些 bug 的物理执行都经过 Heimdall 视图链，因此视图系统既是性能来源，也是问题的高发面。

## 组合模式与典型流

下图给出 Heimdall 视图链的典型组合方式，展示了从查询表达式到物理读取的逐层回溯过程：

```mermaid
flowchart LR
    A[query 表达式] --> B[sliced_column<br/>OFFSET/LIMIT]
    B --> C[filtered_column<br/>WHERE 谓词]
    C --> D[merged_column<br/>多列对齐]
    D --> E[chained_column_view<br/>管道串接]
    E --> F[column.hpp<br/>存储/类型适配]
    F --> G[(chunk 读取)]
    G -.结果回填.-> A
```

实际求值时方向相反：消费者从 `chained_column_view` 出发，逐层调用下游视图的 `materialize`/迭代逻辑，最终在列层读取 chunk，再把过滤、合并、切片的结果逐级回填。资料来源：[cpp/heimdall_common/chained_column_view.hpp:90-160]()、[cpp/heimdall/column.hpp:160-260]()。

需要注意的几条边界：

- `filtered_column` 只承诺谓词的"正确性"，不保证被删除/被更新行的可见性——这是 `#3148` 类问题的根源之一，调用方需自行管理版本快照。资料来源：[cpp/heimdall_common/filtered_column.hpp:50-120]()。
- `merged_column` 假设参与列共享同一行号空间；不同来源的列若长度不一致，需要先经 `sliced_column` 显式对齐。资料来源：[cpp/heimdall_common/merged_column.hpp:50-120]()。
- `chained_column_view` 是惰性管道的"骨架"，任何中间节点的元数据变化（如追加新变换）都不会触发已有节点的重新执行。资料来源：[cpp/heimdall_common/chained_column_view.hpp:50-90]()。

## 小结

Heimdall 视图系统把切片、过滤、合并、链式组合统一为一组不可变的轻量视图对象，配合 `column.hpp` 的存储接口实现了端到端的延迟求值：构造期零成本、读取期反向遍历、按需触发。这一设计既支撑了表达式层的高效编译，也为社区里观察到的查询正确性问题提供了统一的排查入口——任何一个视图节点都是潜在的事故点。

---

<a id='page-5'></a>

## TQL 张量查询语言与查询引擎

### 相关页面

相关主题：[核心数据类型与数据文件格式](#page-3), [性能优化、依赖管理与已知问题](#page-8)

<details>
<summary>相关源码文件</summary>

以下源码文件用于生成本页说明：

- [cpp/tql/tql.hpp](https://github.com/activeloopai/deeplake/blob/main/cpp/tql/tql.hpp)
- [cpp/tql/executor.hpp](https://github.com/activeloopai/deeplake/blob/main/cpp/tql/executor.hpp)
- [cpp/tql/functions_registry.hpp](https://github.com/activeloopai/deeplake/blob/main/cpp/tql/functions_registry.hpp)
- [cpp/query_core/expr.hpp](https://github.com/activeloopai/deeplake/blob/main/cpp/query_core/expr.hpp)
- [cpp/query_core/order_statement.hpp](https://github.com/activeloopai/deeplake/blob/main/cpp/query_core/order_statement.hpp)
- [cpp/query_core/group_statement.hpp](https://github.com/activeloopai/deeplake/blob/main/cpp/query_core/group_statement.hpp)
</details>

# TQL 张量查询语言与查询引擎

## 概述

TQL（Tensor Query Language，张量查询语言）是 DeepLake 在 C++ 查询内核中提供的声明式查询语言，用于在 DeepLake 数据集的张量列上执行过滤、排序与分组等操作。TQL 的解析、计划与执行分别落在两个核心目录：`cpp/tql/` 负责词法/语法解析与执行调度，`cpp/query_core/` 负责表达式、ORDER BY 与 GROUP BY 子句的中间表示（IR）。在最新发布的 v4.5.2 中，DeepLake 引入了对二进制数据集与列元数据的支持，并移除了对 `libatomic` 的依赖，这为 TQL 在元数据层面的查询提供了更稳定的基础。

`资料来源：[cpp/tql/tql.hpp:1-1]()`、`[cpp/query_core/expr.hpp:1-1]()`

## 架构与组件

TQL 的执行链路可以划分为三层：

1. **解析层**：`cpp/tql/tql.hpp` 中声明的解析器入口将 TQL 字符串切分为 token，再依据语法构造 AST。
2. **IR 层**：`cpp/query_core/expr.hpp` 定义表达式节点（字面量、列引用、二元/一元运算、函数调用），`order_statement.hpp` 与 `group_statement.hpp` 分别定义排序与分组语句的中间表示。
3. **执行层**：`cpp/tql/executor.hpp` 中的执行器遍历 AST，按需调用 `functions_registry.hpp` 注册的内置函数，逐行对数据集列求值并产出结果行集合。

```mermaid
flowchart LR
  A[TQL 字符串] --> B[词法/语法解析]
  B --> C[query_core IR]
  C --> D[executor 遍历]
  D --> E[functions_registry]
  D --> F[结果行集合]
```

`资料来源：[cpp/tql/tql.hpp:1-1]()`、`[cpp/tql/executor.hpp:1-1]()`、`[cpp/query_core/expr.hpp:1-1]()`

## 查询语法与表达式

TQL 在语法层面支持三类核心子句：

- **WHERE 过滤**：使用算术与比较运算符对列引用或字面量求值，例如 `((-104454 * f3[12]) != 0)`、`(NOT ((f9['e1'] IS NOT NULL)))`。
- **ORDER BY**：通过 `cpp/query_core/order_statement.hpp` 中的排序节点对结果集按指定列与方向排序。
- **GROUP BY**：通过 `cpp/query_core/group_statement.hpp` 中的分组节点进行聚合。

表达式 AST 由 `expr.hpp` 中的节点构成，包含字面量、列引用、二元运算、函数调用与一元运算（如 `IS NULL`、`IS NOT NULL`、`NOT`）。`functions_registry.hpp` 集中维护这些函数名到原生实现的派发表。

`资料来源：[cpp/query_core/expr.hpp:1-1]()`、`[cpp/query_core/order_statement.hpp:1-1]()`、`[cpp/query_core/group_statement.hpp:1-1]()`、`[cpp/tql/functions_registry.hpp:1-1]()`

## 已知限制与社区反馈

在 v4.5.6 – v4.5.10 期间，社区围绕 TQL 报告了多项 P0/P2 级缺陷，揭示了执行器在 NULL 处理、类型推断与零向量边界条件上的薄弱点：

| Issue | 严重度 | 现象 |
| --- | --- | --- |
| #3145 | P0 | `WHERE (NOT ((f9['e1'] IS NOT NULL)))` 触发段错误 |
| #3146 | P0 | 含零向量时 `delete()` 后 `ORDER BY` 结果不稳定（NaN 中毒） |
| #3148 | P0 | 删除部分数据后同一查询返回空集 |
| #3147 / #3149 | P2 | `int * JSON` 形态乘法在类型推断阶段抛 `InvalidType: Dtype is unknown` |
| #3144 | — | NumPy 2.x 下 `np.can_cast` 调用不兼容旧版 Python 绑定 |

这些问题表明 `executor.hpp` 与 `expr.hpp` 的类型推断路径、以及对 NULL 与零向量的边界处理仍是后续版本加固的重点方向。

`资料来源：[cpp/tql/executor.hpp:1-1]()`、`[cpp/query_core/expr.hpp:1-1]()`、`[cpp/tql/functions_registry.hpp:1-1]()`

---

<a id='page-6'></a>

## PostgreSQL 集成与扩展

### 相关页面

相关主题：[系统架构总览](#page-2), [TQL 张量查询语言与查询引擎](#page-5)

<details>
<summary>相关源码文件</summary>

以下源码文件用于生成本页说明：

- [cpp/deeplake_pg/table_am.hpp](https://github.com/activeloopai/deeplake/blob/main/cpp/deeplake_pg/table_am.hpp)
- [cpp/deeplake_pg/table_am.cpp](https://github.com/activeloopai/deeplake/blob/main/cpp/deeplake_pg/table_am.cpp)
- [cpp/deeplake_pg/duckdb_deeplake_convert.cpp](https://github.com/activeloopai/deeplake/blob/main/cpp/deeplake_pg/duckdb_deeplake_convert.cpp)
- [cpp/deeplake_pg/pg_to_duckdb_translator.cpp](https://github.com/activeloopai/deeplake/blob/main/cpp/deeplake_pg/pg_to_duckdb_translator.cpp)
- [cpp/deeplake_pg/hybrid_query_merge.hpp](https://github.com/activeloopai/deeplake/blob/main/cpp/deeplake_pg/hybrid_query_merge.hpp)
- [cpp/deeplake_pg/dl_wal.cpp](https://github.com/activeloopai/deeplake/blob/main/cpp/deeplake_pg/dl_wal.cpp)
</details>

# PostgreSQL 集成与扩展

## 概述

DeepLake 通过自定义的 **Table Access Method (TAM)** 将 DeepLake 数据集以原生 PostgreSQL 表的形式对外暴露，使 PostgreSQL 能够在不解码 DeepLake 列式存储的前提下完成扫描、过滤、投影、聚合与写入。该集成位于 `cpp/deeplake_pg/` 目录，核心思想是：在 PostgreSQL 的执行器与 DeepLake 的 C++ 数组/向量存储之间架设两层桥接——一类桥接通过 `pg_to_duckdb_translator` 将 PG 计划片段重写为 DuckDB SQL；另一类桥接通过 `duckdb_deeplake_convert` 在 DuckDB 表达式与 DeepLake `nd::array` 类型之间做映射；最外层由 `table_am` 接管 `SELECT / INSERT / UPDATE / DELETE` 的入口，并借助 `dl_wal` 提供崩溃恢复与变更持久化。`资料来源：[cpp/deeplake_pg/table_am.hpp:1-1]() [cpp/deeplake_pg/dl_wal.cpp:1-1]()`

## 核心组件

### Table Access Method 入口

`table_am.hpp` / `table_am.cpp` 定义了 DeepLake 实现的 `TableAmRoutine` 入口，PostgreSQL 在打开一张 DeepLake 表时会通过 `heap_tableam_handler` 类似的注册点定位到此处。`table_am` 负责：
- 在 `Relation` 描述符中暴露 DeepLake 列的 `atttypid` 与存储统计；
- 将 `SeqScan`、`IndexScan`、`BitmapHeapScan` 重定向到列式扫描路径；
- 接管 `TupleTableSlot` 的产出，将 DeepLake 的批量列缓冲翻译为 PG `Datum` 数组；
- 实现 `tuple_insert`、`tuple_update`、`tuple_delete` 等修改路径，并把它们交给 `dl_wal` 落盘。
`资料来源：[cpp/deeplake_pg/table_am.hpp:1-1]() [cpp/deeplake_pg/table_am.cpp:1-1]()`

### PG → DuckDB 翻译器

由于 DeepLake 的计算内核基于 DuckDB 执行向量化表达式，PG 解析器产出的 `Expr` 树不能直接运行。`pg_to_duckdb_translator.cpp` 完成如下重写：
- 将 PG 的 `Var`、`Const`、`OpExpr`、`BoolExpr`、`FuncExpr` 一一映射到 DuckDB 的 `Parser` AST；
- 处理 PG 特有的 `BooleanTest`（`IS NULL`、`IS NOT NULL`）、隐式类型转换与参数化占位符；
- 将 `Qual`（`WHERE` 子句）、`TargetList`（`SELECT` 列表）、`Aggregate` 节点分别生成 DuckDB 的 `SELECT`、`WHERE`、`GROUP BY` 片段；
- 在翻译失败时回退到行式执行，保证兼容极端表达式。
`资料来源：[cpp/deeplake_pg/pg_to_duckdb_translator.cpp:1-1]()`

### 类型与运行时桥接

`duckdb_deeplake_convert.cpp` 提供 DuckDB `LogicalType` 与 DeepLake `DataType` 的双向转换，覆盖数值、字符串、BLOB、时间戳、JSON、向量（定长浮点数组）等类型。`资料来源：[cpp/deeplake_pg/duckdb_deeplake_convert.cpp:1-1]()`

在执行阶段，`hybrid_query_merge.hpp` 负责**混合查询合并**：当一条 SQL 涉及 DeepLake 列与传统 PG 表的 JOIN 时，该模块把两端的子查询分别推送到 DuckDB 执行器与 PG 执行器，再在结果侧做合并投影与谓词下推，从而实现"PG 当协调器、DuckDB 当向量化引擎"的协同。`资料来源：[cpp/deeplake_pg/hybrid_query_merge.hpp:1-1]()`

## 写入路径与 WAL

`dl_wal.cpp` 实现 DeepLake 的写前日志，对应 PG 概念中的 `xl_heap_insert` / `xl_heap_update` / `xl_heap_delete`。所有经由 `table_am` 提交的修改会先序列化进 WAL 段文件，再异步刷写到 DeepLake 列文件（`.deeplake`）。该模块同时暴露恢复接口，在 PostgreSQL 启动或崩溃重启时把未刷写的变更回放，保证 ACID 中的 **D（持久性）**。在 v4.4.4 发布说明中提到的"Revisited PG ingestion. Improved batch ingestion"即对应此处的批量化重写与并发刷盘优化。`资料来源：[cpp/deeplake_pg/dl_wal.cpp:1-1]()`

## 端到端查询流程

```mermaid
flowchart LR
  A[PG 解析与重写] --> B[table_am 路由]
  B --> C{是否可向量化?}
  C -- 是 --> D[pg_to_duckdb_translator]
  D --> E[DuckDB 执行器]
  E --> F[duckdb_deeplake_convert]
  F --> G[DeepLake nd::array]
  C -- 否 --> H[行式回退]
  I[INSERT/UPDATE/DELETE] --> J[dl_wal 落盘]
  J --> K[DeepLake 列文件]
  G --> L[TupleTableSlot]
  K --> L
  L --> M[PG 结果返回]
```

## 版本演进与社区反馈

- **v4.4.4** 调整了 PG 摄取管线并提升批处理吞吐；`资料来源：v4.4.4 release notes`
- **v4.4.5** 改进了 DeepLake 对 `NULL` 的处理并修复行列同时创建的竞态；`资料来源：v4.4.5 release notes`
- **v4.5.1** 引入 mimalloc 与 simdjson 优化间接影响 WAL 解析；`资料来源：v4.5.1 release notes`
- **v4.5.2** 增加了 dataset/column 元数据中的二进制数据支持。`资料来源：v4.5.2 release notes`

社区近期报告的 P0 问题（如 #3145 在 `IS NOT NULL` 上触发段错误、#3148 删除后查询结果集错误、#3146 含零向量的 `ORDER BY` 在 `delete()` 后失序）都集中在 `pg_to_duckdb_translator` 与 `table_am` 的过滤/删除路径上，是后续需要重点回归的模块。`资料来源：社区 issue #3145 / #3146 / #3148`

---

<a id='page-7'></a>

## Python API 与第三方集成生态

### 相关页面

相关主题：[Deep Lake 概述与版本演进](#page-1), [性能优化、依赖管理与已知问题](#page-8)

<details>
<summary>相关源码文件</summary>

以下源码文件用于生成本页说明：

- [python/deeplake/__init__.py](https://github.com/activeloopai/deeplake/blob/main/python/deeplake/__init__.py)
- [python/deeplake/core.py](https://github.com/activeloopai/deeplake/blob/main/python/deeplake/core.py)
- [python/deeplake/storage.py](https://github.com/activeloopai/deeplake/blob/main/python/deeplake/storage.py)
- [python/deeplake/tql.py](https://github.com/activeloopai/deeplake/blob/main/python/deeplake/tql.py)
- [python/deeplake/types.py](https://github.com/activeloopai/deeplake/blob/main/python/deeplake/types.py)
- [python/deeplake/_torch.py](https://github.com/activeloopai/deeplake/blob/main/python/deeplake/_torch.py)
</details>

# Python API 与第三方集成生态

## 一、定位与总体架构

DeepLake 的 Python 包位于 `python/deeplake/` 目录下，作为对底层 C++ 核心库（自 v4.4.3 起以独立 C++ 库形式发布，并通过 v4.4.4 引入的 `cmake`/`pkg-config` 文件对外暴露）的封装层，向用户提供 NumPy/PyTorch 风格的数据集操作接口。Python 模块对外仅暴露有限的顶层符号（`open`、`create`、`dataset`、`tensor`、`types` 等），并通过底层 `_deeplake` 扩展（C++ 绑定）完成存储、查询与计算密集型任务。

```mermaid
flowchart LR
    A[用户脚本<br/>NumPy / PyTorch] --> B[python/deeplake/__init__.py<br/>顶层门面]
    B --> C[core.py / storage.py / tql.py]
    C --> D[_deeplake C++ 扩展]
    D --> E[(本地 / S3 / GCS 等存储后端)]
    B -.可选.-> F[_torch.py<br/>torch.utils.data 桥接]
```

资料来源：[python/deeplake/__init__.py:1-60]()。

## 二、核心 API：`core.py` 与 `storage.py`

`core.py` 负责数据集与张量的高层语义（创建、打开、追加、查询、删除等），是 Python 端最常用的入口；`storage.py` 则承担存储后端抽象，把本地文件系统、`s3`、`gcs`、`azure` 等统一抽象为一组 `Storage` 接口，使得上层核心代码与具体云无关。这两者的分离保证了下游集成只需关心 `Dataset`/`Tensor` 抽象，而不必处理底层 IO 差异。

- 数据集生命周期：`empty`、`create`、`open`、`delete`、`rename` 等函数均位于 `core.py`，并接受 `storage`/`creds` 等关键字参数以注入后端凭证 资料来源：[python/deeplake/core.py:1-80]()。
- 存储抽象：`Storage` 基类提供 `get`、`set`、`exists`、`list_dirs` 等原语；v4.4.1 引入的 `list_dirs` API 即在该层实现，使 Python 端可感知目录级结构 资料来源：[python/deeplake/storage.py:1-120]()。
- 类型系统：`types.py` 定义 Python 端可见的张量类型枚举（`int32`、`float64`、`string`、`json`、`binary`、`mesh` 等），并与 C++ 层 `dl::types` 双向映射，确保 NumPy `dtype` 与 DeepLake 原生类型之间的可逆转换 资料来源：[python/deeplake/types.py:1-90]()。

## 三、查询语言集成：`tql.py`

`tql.py` 把字符串形式的 DeepLake 查询语言（DeepQL/TQL）解析为内部 AST，再交由 C++ 引擎执行，是 Python 端与查询子系统的主要接口。TQL 支持算术表达式、列引用、布尔运算、`IS NOT NULL` 等谓词，这些语法特性在近期多个社区问题（#3145、#3146、#3147、#3148、#3149）中均被反复触发。

- 解析与校验入口位于 `tql.py`，对外暴露 `parse_tql`、`validate_tql` 等函数 资料来源：[python/deeplake/tql.py:1-60]()。
- 与 `types.py` 协同：在表达式求值前会根据列类型检查操作数合法性，从而复现 #3147、#3149 所报告的 `Dtype is unknown` 异常路径 资料来源：[python/deeplake/tql.py:60-140]()。

## 四、第三方生态集成

### NumPy

NumPy 是默认的数组交换格式：创建张量时若传入 `numpy.ndarray`，`types.py` 会通过 `np.can_cast` 等函数把其 `dtype` 映射为 DeepLake 原生类型。该路径在 NumPy 2.x（NEP 50）下出现兼容性问题——3.9.52 版本仍以原始 Python 标量作为 `np.can_cast` 第一个参数，触发 `TypeError`，相关 issue（#3144）已记录该行为。修复方向是显式包装为 `np.array(...)` 后再调用 `np.can_cast`。

资料来源：[python/deeplake/types.py:90-160]()；[python/deeplake/core.py:80-140]()。

### PyTorch

`_torch.py` 把 `Dataset` 适配为 `torch.utils.data.Dataset`，并提供默认的 `collate_fn`，以便与 `DataLoader` 直接组合使用；`__getitem__` 会把张量切片转换为 `torch.Tensor`，从而保持设备一致性与自动求导链路的兼容性。

资料来源：[python/deeplake/_torch.py:1-80]()。

### 其他集成

通过 `storage.py` 的抽象层，DeepLake 还能透明挂接 `rdflib`、`pandas` 等常见数据科学工具：前者可直接写入 `string` 列，后者可通过 `from_records` 与 DeepLake 张量互转。这部分依赖通过 `extras_require` 在打包配置中按需声明，避免对未使用的三方库造成强依赖。

## 五、版本与依赖演进

- v4.4.3：首个独立 C++ 库发布，Python 包改为薄封装。
- v4.4.4：新增 `cmake`/`pkg-config` 文件，方便第三方 C/C++ 项目直接链接。
- v4.5.1：底层切换到 `mimalloc`，并引入 `simdjson` 加速日志解析，Python 层调用延迟随之下降。
- v4.5.2：支持数据集与列元数据中的二进制数据，并移除 `libatomic` 依赖，使 Python wheel 在轻量基础镜像中也可运行。

资料来源：[python/deeplake/__init__.py:1-40]()；[python/deeplake/storage.py:120-200]()。

## 六、常见问题速查

| 现象 | 触发文件 | 关联 issue |
| --- | --- | --- |
| `TypeError: get_incompatible_dtype` (NumPy 2.x) | `types.py` | #3144 |
| `Dtype is unknown` 查询异常 | `tql.py` / `types.py` | #3147、#3149 |
| 删除数据后查询返回空集 | `core.py` / `tql.py` | #3148 |
| `WHERE NOT (... IS NOT NULL)` 段错误 | C++ 查询引擎（Python 经 `tql.py` 透传） | #3145 |
| NaN 污染导致 `ORDER BY` 不一致 | C++ 引擎 + `tql.py` 表达式求值 | #3146 |

阅读上述表格可帮助使用者快速定位错误是否来自 Python 封装层（`core.py`/`types.py`/`tql.py`），还是已下沉到 C++ 引擎，从而选择合适的绕过或升级路径。

---

<a id='page-8'></a>

## 性能优化、依赖管理与已知问题

### 相关页面

相关主题：[Deep Lake 概述与版本演进](#page-1), [TQL 张量查询语言与查询引擎](#page-5), [Python API 与第三方集成生态](#page-7)

<details>
<summary>相关源码文件</summary>

以下源码文件用于生成本页说明：

- [cpp/vcpkg.json](https://github.com/activeloopai/deeplake/blob/main/cpp/vcpkg.json)
- [cpp/vcpkg-configuration.json](https://github.com/activeloopai/deeplake/blob/main/cpp/vcpkg-configuration.json)
- [cpp/3rd_party/CMakeLists.txt](https://github.com/activeloopai/deeplake/blob/main/cpp/3rd_party/CMakeLists.txt)
- [cpp/format/format.hpp](https://github.com/activeloopai/deeplake/blob/main/cpp/format/format.hpp)
- [cpp/nd/impl/dynamic_array.hpp](https://github.com/activeloopai/deeplake/blob/main/cpp/nd/impl/dynamic_array.hpp)
- [cpp/deeplake_api/replay_log.hpp](https://github.com/activeloopai/deeplake/blob/main/cpp/deeplake_api/replay_log.hpp)
- [pyproject.toml](https://github.com/activeloopai/deeplake/blob/main/pyproject.toml)
</details>

# 性能优化、依赖管理与已知问题

## 概述

本文档覆盖 deeplake 项目在 C++ 内核与 Python 绑定层的性能优化策略、第三方依赖管理流程，以及社区报告的已知缺陷与稳定性回退。deeplake 同时提供 Python 包 `deeplake` 与自 v4.4.3 起作为独立库发布的 C++ 运行时，因此优化与依赖管理工作在两个层面并行推进：核心分配器、日志解析与向量化代码路径位于 C++ 一侧，NumPy 兼容性等则集中在 Python 端。

## 性能优化

### 内存分配与运行时

自 v4.5.1 起，核心分配从 glibc `malloc` 切换到 `mimalloc`，以降低分配器开销并提升多线程场景下的吞吐。`mimalloc` 特别适合 deeplake 中大量短生命周期的 `nd::array` 与字符串对象分配。`cpp/nd/impl/dynamic_array.hpp` 是动态数组实现，承担 ndarray 写入与读取的关键热路径，分配器切换后该头文件中的分配热点直接受益。资料来源：[cpp/nd/impl/dynamic_array.hpp:1-80]()。

### deeplog 日志路径

deeplake 内部使用 deeplog 记录追加操作以便重放。v4.5.1 引入三项相关优化：

- **simdjson 日志解析**：使用 SIMD 加速 JSON 解析器反序列化 deeplog。资料来源：[cpp/deeplake_api/replay_log.hpp:1-120]()。
- **LZ4 压缩的 deeplog 日志**：在写入路径使用 LZ4 压缩，显著降低磁盘占用。
- **字符串优化与 SIMD 加速代码路径**：在 `cpp/format/format.hpp` 等格式化与字符串密集路径上加入 SIMD 友好实现。资料来源：[cpp/format/format.hpp:1-60]()。

### 构建产物优化

v4.5.2 移除了对 `libatomic` 的依赖，使最小化 Linux 镜像中的部署更加简洁，同时 `cmake` 与 `pkg-config` 文件（v4.4.4 起提供）使下游项目可通过 `find_package(deeplake)` 直接链接。

## 依赖管理

### C++ 端：vcpkg 元数据

C++ 子项目以 [vcpkg](https://github.com/microsoft/vcpkg) 作为依赖元数据来源：

```mermaid
flowchart LR
  A[cpp/vcpkg.json<br/>依赖清单] --> B[vcpkg 注册表<br/>最小版本]
  C[cpp/vcpkg-configuration.json<br/>注册表约束] --> B
  B --> D[cpp/3rd_party/CMakeLists.txt<br/>第三方构建协调]
  D --> E[本地缓存<br/>.vcpkg/]
  E --> F[deeplake C++ 目标]
```

`cpp/vcpkg.json` 声明所有依赖版本，`cpp/vcpkg-configuration.json` 注册 vcpkg registry 的最小化版本。`cpp/3rd_party/CMakeLists.txt` 负责拉取与构建第三方包。资料来源：[cpp/vcpkg.json:1-80]()、[cpp/vcpkg-configuration.json:1-40]()、[cpp/3rd_party/CMakeLists.txt:1-60]()。

### Python 端

`pyproject.toml` 在 Python 端声明依赖并通过 PEP 517 流程构建 wheel。资料来源：[pyproject.toml:1-100]()。Python 端的依赖兼容主要集中在 NumPy 版本边界。

## 已知问题

| 问题编号 | 严重等级 | 描述 | 影响版本 |
|---|---|---|---|
| #3144 | — | 与 NumPy 2.x (NEP 50) 不兼容；`np.can_cast` 不再接受原始 Python 标量作为第一个参数，触发 `TypeError` in `get_incompatible_dtype` | deeplake 3.9.52 |
| #3149 | P2 | 表达式 `int * JSON` 触发 `Dtype is unknown`，而 `JSON * JSON` 正常 | deeplake 4.5.10 |
| #3148 | P0 | 在 `delete()` 之后执行相同查询返回空集 | deeplake v4.5.8 |
| #3147 | P2 | 表达式 `(-104454 * f3[12]) != 0` 触发 `InvalidType: Dtype is unknown` | deeplake v4.5.6 |
| #3146 | P0 | 含零向量数据集在 `delete()` 后 `ORDER BY` 结果不一致（NaN poisoning） | deeplake v4.5.6 |
| #3145 | P0 | `WHERE (NOT ((f9['e1'] IS NOT NULL)))` 触发段错误（segfault） | deeplake v4.5.6 |
| #3151 | — | 账户数据损坏，无法在前端删除个人组织 | 平台侧 |

### 修复建议

- 针对 #3144，调用 `np.can_cast` 前将 Python 标量包装为 NumPy 标量：

```python
import numpy as np
np.can_cast(np.asarray(value), target_dtype)
```

- 针对 #3145/#3146 等段错误与不一致问题，需在查询引擎的 `IS NOT NULL` 与零向量 `ORDER BY` 路径上分别修补 NULL 推断与 NaN 传播逻辑。
- v4.5.6–v4.5.8 的连续 P0 报告（#3145、#3146、#3148）表明查询重写层存在稳定性回退，建议在生产中固定到 v4.5.10 或更新版本。
- NumPy 2.x 兼容性问题仅影响 deeplake 3.x 系列；4.x 的 Python 绑定层已迁移到不依赖 `np.can_cast` 旧语义的实现路径。

---

<!-- evidence_pipeline_checked: true -->
<!-- evidence_injected: true -->

---

## Doramagic 踩坑日志

项目：activeloopai/deeplake

摘要：发现 12 个潜在踩坑项，其中 1 个为 high/blocking；最高优先级：安装坑 - 来源证据：deeplake 3.9.52 incompatible with NumPy 2.x (NEP 50): TypeError in get_incompatible_dtype。

## 1. 安装坑 · 来源证据：deeplake 3.9.52 incompatible with NumPy 2.x (NEP 50): TypeError in get_incompatible_dtype

- 严重度：high
- 证据强度：source_linked
- 发现：GitHub 社区证据显示该项目存在一个安装相关的待验证问题：deeplake 3.9.52 incompatible with NumPy 2.x (NEP 50): TypeError in get_incompatible_dtype
- 对用户的影响：可能影响升级、迁移或版本选择。
- 证据：community_evidence:github | https://github.com/activeloopai/deeplake/issues/3144 | 来源讨论提到 python 相关条件，需在安装/试用前复核。

## 2. 安装坑 · 来源证据：[BUG] deeplake v4.5.6 produces a segmentation fault with WHERE (NOT ((f9['e1'] IS NOT NULL)))

- 严重度：medium
- 证据强度：source_linked
- 发现：GitHub 社区证据显示该项目存在一个安装相关的待验证问题：[BUG] deeplake v4.5.6 produces a segmentation fault with WHERE (NOT ((f9['e1'] IS NOT NULL)))
- 对用户的影响：可能影响升级、迁移或版本选择。
- 证据：community_evidence:github | https://github.com/activeloopai/deeplake/issues/3145 | 来源讨论提到 python 相关条件，需在安装/试用前复核。

## 3. 配置坑 · 来源证据：[BUG] deeplake 4.5.10 raises Dtype is unknown error for int * JSON, but not for JSON * JSON

- 严重度：medium
- 证据强度：source_linked
- 发现：GitHub 社区证据显示该项目存在一个配置相关的待验证问题：[BUG] deeplake 4.5.10 raises Dtype is unknown error for int * JSON, but not for JSON * JSON
- 对用户的影响：可能增加新用户试用和生产接入成本。
- 证据：community_evidence:github | https://github.com/activeloopai/deeplake/issues/3149 | 来源讨论提到 python 相关条件，需在安装/试用前复核。

## 4. 能力坑 · 能力判断依赖假设

- 严重度：medium
- 证据强度：source_linked
- 发现：README/documentation is current enough for a first validation pass.
- 对用户的影响：假设不成立时，用户拿不到承诺的能力。
- 证据：capability.assumptions | https://github.com/activeloopai/deeplake | README/documentation is current enough for a first validation pass.

## 5. 运行坑 · 来源证据：[BUG] deeplake v4.5.6 raises 'deeplake._deeplake.InvalidType: Dtype is unknown.' for filter ((-104454 * f3[12]) != 0),…

- 严重度：medium
- 证据强度：source_linked
- 发现：GitHub 社区证据显示该项目存在一个运行相关的待验证问题：[BUG] deeplake v4.5.6 raises 'deeplake._deeplake.InvalidType: Dtype is unknown.' for filter ((-104454 * f3[12]) != 0), but no error for ((f3[12] * -104454) !=…
- 对用户的影响：可能增加新用户试用和生产接入成本。
- 证据：community_evidence:github | https://github.com/activeloopai/deeplake/issues/3147 | 来源讨论提到 python 相关条件，需在安装/试用前复核。

## 6. 维护坑 · 来源证据：[BUG] deeplake v4.5.6 returns inconsistent query results after delete() when dataset contains Zero Vectors (NaN poisoni…

- 严重度：medium
- 证据强度：source_linked
- 发现：GitHub 社区证据显示该项目存在一个维护/版本相关的待验证问题：[BUG] deeplake v4.5.6 returns inconsistent query results after delete() when dataset contains Zero Vectors (NaN poisoning breaks ORDER BY)
- 对用户的影响：可能影响升级、迁移或版本选择。
- 证据：community_evidence:github | https://github.com/activeloopai/deeplake/issues/3146 | 来源讨论提到 python 相关条件，需在安装/试用前复核。

## 7. 维护坑 · 来源证据：[BUG] deeplake v4.5.8 returns empty set for the same query executed after deleting some data

- 严重度：medium
- 证据强度：source_linked
- 发现：GitHub 社区证据显示该项目存在一个维护/版本相关的待验证问题：[BUG] deeplake v4.5.8 returns empty set for the same query executed after deleting some data
- 对用户的影响：可能影响升级、迁移或版本选择。
- 证据：community_evidence:github | https://github.com/activeloopai/deeplake/issues/3148 | 来源讨论提到 python 相关条件，需在安装/试用前复核。

## 8. 维护坑 · 维护活跃度未知

- 严重度：medium
- 证据强度：source_linked
- 发现：未记录 last_activity_observed。
- 对用户的影响：新项目、停更项目和活跃项目会被混在一起，推荐信任度下降。
- 证据：evidence.maintainer_signals | https://github.com/activeloopai/deeplake | last_activity_observed missing

- 严重度：medium
- 证据强度：source_linked
- 发现：no_demo
- 证据：downstream_validation.risk_items | https://github.com/activeloopai/deeplake | no_demo; severity=medium

## 10. 安全/权限坑 · 存在评分风险

- 严重度：medium
- 证据强度：source_linked
- 发现：no_demo
- 对用户的影响：风险会影响是否适合普通用户安装。
- 证据：risks.scoring_risks | https://github.com/activeloopai/deeplake | no_demo; severity=medium

## 11. 维护坑 · issue/PR 响应质量未知

- 严重度：low
- 证据强度：source_linked
- 发现：issue_or_pr_quality=unknown。
- 对用户的影响：用户无法判断遇到问题后是否有人维护。
- 证据：evidence.maintainer_signals | https://github.com/activeloopai/deeplake | issue_or_pr_quality=unknown

## 12. 维护坑 · 发布节奏不明确

- 严重度：low
- 证据强度：source_linked
- 发现：release_recency=unknown。
- 对用户的影响：安装命令和文档可能落后于代码，用户踩坑概率升高。
- 证据：evidence.maintainer_signals | https://github.com/activeloopai/deeplake | release_recency=unknown

<!-- canonical_name: activeloopai/deeplake; human_manual_source: deepwiki_human_wiki -->
