- 博客(692)
- 资源 (3)
- 收藏
- 关注
原创 我写操作系统的一点经验【原创】
我的项目代码: http://code.google.com/p/maray/这两天我在写计划,完成后在此博客公布。发信人: raywill (晓楚), 信区: Linux标 题: 我写操作系统的一点经验发信站: 武汉白云黄鹤站 (2007年09月14日22:39:30 星期五)转瞬2年!Linux版上又见“有人写操作系统吗?”这样的帖子。2年前,有个叫raywill的小子不也是发过
2007-10-07 10:22:00
2571
7
原创 体验 Neon 产品
摘要:Neon注册流程简单快捷,支持Google登录并选择AWS/Azure云平台。用户下载客户端后完成授权,即可获取连接串对接AI工具,实现代码直连Neon数据库。整个过程仅需20分钟,最新版本还支持PostgreSQL作为后端,大幅提升开发效率。系统初始化后可直接查看所有数据,为开发者提供极大便利。
2026-01-08 10:41:04
260
原创 SeekInsight!
SeekInsight是一款创新的AI辅助数据分析平台,其核心特色包括:1)异构数据处理能力,支持TXT/CSV/Excel自动结构化并兼容中文编码;2)双引擎开发环境,提供SQL和Python工作台的无缝切换;3)智能洞察系统,基于表结构主动生成分析建议;4)可视化闭环,自动推荐图表类型并生成业务报告。平台采用React+Node.js技术栈,通过沙箱隔离实现多项目并行开发,特别注重中文友好性和非技术用户的使用体验,完成了从数据导入到决策输出的全流程自动化。
2025-12-26 10:39:32
902
原创 混合搜索中的条件下压需求
举个例子,Glean 是一个企业 AI 搜索软件,它能够非常高质量地针对用户自然查询语言搜出符合要求的文档,并且,这些文档都是用户有权限访问的文档。自然语言搜索会用到向量索引,企业会基于所有文档构建出一个统一的向量索引出来,对于用户小余来说,它实际有权限访问的,只是里面很少的一部分。查询期间,我们可以带上访问权限 ID 列表,或者带上基于这个列表生成的位图,去搜索向量索引。通过这个位图,我们可以极大地降低向量计算量,跳过不必要的计算。企业里有一个文档权限表,里面详细记录了小余有权限访问的文档 ID。
2025-12-04 12:23:15
220
原创 Chroma 的设计哲学
你将 Query 传给 Chroma 后,Chroma 内部先用 DuckDB 的 SQL 在磁盘上按 metadata(比如 source=“wiki” 且 date>2024-01-01)筛出候选 id 列表,然后只把这些候选的 embedding 读入内存并计算相似度,减少计算量。可以看到,Chroma 的核心贡献在于向量搜索,至于存储,完全委托给了 duckdb 等嵌入式存储,他们各自发挥各自的优势,将能力组合,发挥出更大的价值,同时还留给用户足够的灵活性。创建 Chroma 时,可以通过。
2025-11-26 00:10:36
436
原创 在 MacOS 场景下体验 seekdb embeded
SeekDB目前尚不支持MacOS原生运行,但可通过Docker镜像体验。该工具处于概念演示阶段,提供流畅的体验和丰富的SDK接口,但需增强AI能力(如支持更多自定义模型和嵌入函数)及多媒体数据处理功能。安装步骤包括:1)通过Docker运行SeekDB;2)在容器内安装Python3和pip3;3)安装pyseekdb及相关依赖库。整体而言,SeekDB为开发者提供了便利的开发界面,但仍需完善功能扩展。
2025-11-20 21:25:18
1324
原创 对 Transformer Position Encoding 的学习理解
我们会发现,当 x 比较小的时候,数值之间是有规律的,但是当 x 变大后,因为 sin(x) 的周期特征,它的值会被“折叠”,某种意义上,这个值就变成了和随机值差不多的东西。但是他有一个缺点,因为它在 0 到无穷大的范围内平滑地从 -1 变化到 1,可能相邻位置在高维空间的投影距离非常近,难以被机器学习出来,不容易收敛。任何特征,能学习的前提,是它具备一定的规律。(1) 一个句子中的 token,我们是可以用 0 到 N 来给它做位置编码的,但是这种编码方式不便于计算,且缺少一些很牛的性质。
2025-11-09 16:19:15
692
原创 使用 GPT + Manim 生成动画的体验非常好
应该是提示词还不够详细,生成的内容还需要人工微调一下,但是大体结构是非常好的,只需要稍微花费一点力气就可以调整好。最终,通过稍微的调整,输入了如下代码,效果非常棒。使用 GPT + Manim 生成动画的体验非常好。
2025-11-02 04:55:52
306
原创 循环展开与GCC
做了循环展开,但是并没有做指令重拍以适应 CPU 流水执行,但 10.2 就已经解决了这个问题。但从 10.2、11.2 这些版本,二者生成的汇编代码一模一样,性能也完全相同。在 8.2、9.2 这两个 GCC compiler 中,所以,对于小整数的循环,要相信编译器的循环展开能力。下面两个函数,哪个更快?虽然 8.2 中已经对。
2025-10-22 05:10:28
171
原创 大模型的角色
摘要:大模型本质是无状态的,其连续会话能力由外部Agent维护上下文实现。Agent负责编排流程、调用工具和管理交互状态,而大模型仅返回决策结果(文本或工具调用指令)。上下文工程是核心挑战,涉及短期/长期记忆管理、向量检索等技术,以解决对话爆炸问题。数据库领域的AI需求(如embedding)主要服务于高效上下文检索。
2025-10-18 10:49:02
380
原创 学习小智 AI 生态
小智AI是一款由硬件、开源固件和服务端组成的聊天玩具,其台湾腔陪聊功能广受欢迎。最初闭源的服务端被团队复刻并开源,用户无需订阅即可永久使用。该系统整合了国内多家云服务商的免费AI方案,包括智谱的LLM和视觉模块。开发者可通过修改开源固件扩展硬件功能,或通过MCP扩展后端能力。小智的核心交互依赖于液晶显示和语音输入/输出模块,而后端服务则提供了丰富的扩展可能性。
2025-10-16 07:30:09
1599
原创 各种数据库的过滤物化
缺点:算子实现复杂,需要“带掩码”处理,某些 SIMD 优化较难。ClickHouse 每次 filter 都会生成新 column(物理拷贝),下游算子只处理“干净”的数据块。以前没怎么考虑过这个问题,实际写了一些带 selector 的代码,才知道每一步都物化的话,代码写起来有多爽。这些系统经常使用掩码(mask)或者 selection vector来表示哪些行有效,而不是立即拷贝数据。通常还是“逐行遍历+逐行判断”,不进行大规模批量拷贝,也不专门维护 selection vector。
2025-10-12 06:20:56
353
原创 一个循环的编译优化
实战中还是应该通过去看汇编代码来确认,然后通过一些相关技术来提示编译器做优化。本文的目的是让你理解,在部分情况下即使有数据依赖,编译器依然还有优化的思路。通过这种改写,虽然减少了乘法,但是我们也注意到,增加 temp 后,会让每次循环迭代都依赖上一次循环迭代完成,这无疑是不利于 CPU 流水执行的呀!不过,这里还有一个问题:如果循环次数不是 100,而是一个未知的变量 n 呢?可以做循环展开,然后做 SIMD。只能说,现代编译器是真的有点聪明!
2025-10-11 03:44:12
217
原创 一个循环的优化
本文对比了三种从1024字节数组中选取n(1-8)个字节组合成uint64_t的方法。方法1使用简单循环,方法2采用Duff's Device技术进行循环展开,方法3则完全暴力展开所有情况。测试结果表明:方法3性能最优,方法2次之,方法1最慢。这种性能差异源于分支预测和指令级并行优化,完全展开的代码能最大化利用CPU流水线。对于小规模循环(n≤8),暴力展开是最高效的实现方式。
2025-10-10 03:31:38
430
原创 论 AI Database
摘要:文章提出将数据库作为AI开发的核心控制平面,通过声明式API统一管理数据、特征和模型元数据。关键设计包括:1)SQL扩展支持AI原语 2)集中式元数据管理 3)强制治理策略 4)可插拔执行后端。MVP建议从向量查询、推理API和模型注册入手。该方案面临的主要挑战包括开发者习惯改变、性能优化、生态兼容性以及组织变革阻力。(149字)
2025-09-29 23:51:54
831
原创 一个 AP 题目引发的学习过程
自然界中,不连续的情况很少,但是人为定义的系统中,不连续很常见。大家最能理解的,就是税务问题,多发一块钱年终奖,结果多缴纳几百块的税,有了 GPT 后,在学习这个内容,一下子就 reasonable 了。接近0的时候,值为1,等于0的时候值为-1,这不是要天下大乱了吗?数学总是太抽象,真实生活中怎么会遇到这样的场景呢?上面这些例子,都是很有道理的。下面是一个美国高二学生的 AP 题目,要求理解这个式子。数学,还是很有用的。
2025-09-12 00:45:50
1085
原创 如何优化遍历向量元素的循环?
在这个基础上,我们还可以进一步定制 forEach,比如添加循环展开的模板参数,指导 forEach 做编译期循环展开,可以进一步提升循环遍历性能。isConstantArray 这个条件,是在 Vector 初始化阶段就定好了的,但它又不是一个模板参数,所以很难用模板特化的方式解决。循环里有大量的分支跳转,流水线早就被打得四分五裂了,forEach 已经带来不了什么好处,更不用提应用循环展开。但这个需要一定的设计来配合,比如,在 OceanBase 中,就不太容易应用这个技术。
2025-07-15 01:40:38
508
原创 分布式顺序数据发生器
本文提出了一种分布式顺序数据发生器的实现算法。该方案通过预先约定各worker节点的数值分配规则,实现无锁并行生成有序稠密的序列值。该算法能更好地避免数据倾斜问题,适用于分布式环境下高效生成连续序列值的场景。
2025-06-18 22:55:07
598
原创 计算血缘 ---- 一个天马星空的想法速记
在处理千亿级别大表的分组求和计算时,计算机通常采用全量扫描的方法,而人类则会根据更新的数据特征,智能地调整计算结果。为了提升计算机的智能性,可以引入“计算血缘”概念,记录每行数据与源文件的对应关系,从而在数据更新时仅重新计算相关文件,提高效率。然而,这种方法的效果取决于数据分布的集中程度。相比之下,人类基于增量计算的算法更为高效,如GIC算法和OceanBase中的“增量物化视图”技术,它们支持聚合和简单连接操作,但存在一定限制。总体而言,结合人类智能的计算方法在优化大数据处理效率方面更具潜力。
2025-05-20 03:46:30
233
原创 对 Lambda 架构问题的深入理解
答:因为 Flink 的计算有时间窗口的概念,比如:每个整点,计算上一个小时的销售额。因为队列延迟、网络出错、重试导致数据重复等原因,会让 Kafka 等队列中的数据不能完全被信任,上一个小时的数据不一定真的全了,可能有一些数据要等几分钟才到,也有可能永远不到。原因如下,特别是第一条,会让业务运营存在不确定性,为了应对这种不确定性,可能需要预留出业务余量,造成浪费。简而言之:因为实时数据不准确,那么 Serving 的到的数据肯定也不准确。• 结果第二天离线数据跑完,真实注册是 1100,实际早就达成了。
2025-05-20 00:28:18
685
原创 基于 std::visit 和 std::variant 的请求分发
在数据库实现中,消息处理通常通过为每个消息设计一个code,并使用switch-case进行分发。这种方式逻辑清晰,便于理解和问题定位,但存在管理code复杂、新增消息类型需多处修改等缺点。文章介绍了一种基于std::visit和std::variant的请求分发方法,通过将请求封装为variant类型,利用std::visit根据请求类型自动调用相应的处理函数。这种方法在面向对象的角度更为干净,且std::visit内部通过索引自动生成类似switch-case的代码,简化了消息分发的实现。
2025-05-17 03:44:30
276
原创 数据库领域的 Data Analytics 与 Data Engineering 分别是什么概念?
在 Snowflake 和 Databricks 的语境中,"Data Analytics revenue" 和 "Data Engineering revenue" 虽然并非官方财报中的标准分类,但在业务拓展和市场细分中具有重要意义。Data Analytics 收入主要来源于客户将平台用于数据分析、BI 报表、探索性分析等场景,而 Data Engineering 收入则来自数据管道开发、ETL/ELT 工作流、数据清洗等工程类任务。尽管数据分析和数据工程在数据生
2025-05-14 02:49:21
1086
原创 局部和整体的关系
这是一个非常本质的问题,其实你已经接近数学和物理中“几何本质”的核心了。如果你愿意,我可以给你举几个现实中的例子(比如地球地图拼贴、天气预测、物理场)来加深这个理念。👉 比如我们站在地球上,只能看到脚下那一小块平面(局部),但整个地球是球体(整体)。🧩「如果我们知道每个局部是怎样的,它们又是如何连接的,那整个空间会是什么样?• 局部都像欧几里得空间(我们熟悉的直角坐标系、平面等)🧠 例子 3:人脑的理解方式(局部推理构建整体认知)• 构建出完整的空间认知(比如你能“想象”你的家)
2025-04-29 22:26:32
912
原创 GPU 架构入门笔记
引文位置:https://www.trainy.ai/blog/gpu-utilization-misleading。相关概念是通过 ChatGPT 迅速学习总结而成。
2025-04-28 23:48:00
723
原创 std::vector 自定义分配器
在 std::vector<T, Alloc> 的实现中,会通过 allocator_traits<Alloc>::rebind_alloc<U>(或直接用 Alloc::rebind<U>::other)来为不同用途分配内存。在 C++17 及以前需要自定义,但从 C++20 起 allocator_traits 会使用 std::allocator_traits::construct,你可以省略这两个方法,让 allocator_traits 使用完美转发到 ::new。
2025-04-22 23:22:32
1011
原创 std::move
如果写一个相关的教程,完全不应该从 std::move 入手,而是应该从如何降低对象拷贝代价入手。所以,std::move 的确什么事情都不做,它只是提示编译器,去调用支持 move 语义的函数而已,具体做事情的,是这些函数。Note:STL 中,vector 的 emplace_back、push_back 等也实现了支持 move 语义等版本。对于这种情况,就算用了 std::move,也没有什么用。有些时候,我们不希望做深拷贝。此时,下面的逻辑取决于 A 的拷贝构造函数实现,一般来说,会把。
2025-03-19 22:20:47
422
原创 DailyNotes 增加提醒功能
TODO:准备给 DailyNotes 增加一个提醒功能,准备接入 AI 来做一些事情。试了一下,非常靠谱。具体 DailyNotes 和 Ollama 的交互方式,可以直接调用命令行,也可以走网络API。
2025-03-05 23:40:24
377
原创 深入理解 Clang-Tidy 的窄整形转换警告(Narrowing Conversion)及其配置方法
窄整形转换是指将一个较大范围的数据类型转换为一个较小范围的数据类型,可能导致数据丢失或溢出。常见的转换包括将 int 转换为 short 或将 size_t 转换为 int。如果目标类型的范围比源类型小,则可能丢失数据,尤其是在数值超出目标类型的表示范围时。例子 1:窄整形转换假设我们在 64 位系统中工作,size_t 和 ptrdiff_t 是 8 字节类型,而 int 和 short 是 4 字节和 2 字节类型。如果将一个大范围的类型转换为较小范围的类型,就可能发生溢出或数据丢失。
2025-02-28 03:48:31
2213
原创 支持lambda的ctags
universal ctags 安装也简单,直接从 github checkout 编译安装,然后把 ctags 路径放到 PATH 最前面,覆盖默认的 exuberant ctags。universal ctags 能更好地支持现代 C++,例如 using 里定义的类型、lambda 等。如果你发现你的 ctags 不支持 Lambda 函数的跳转,那说明你的 ctags 该更新了。exuberant ctags 在 2009 年就停止更新了,你大概率用的是这一个。
2024-11-11 10:32:21
332
原创 向量执行优化之手工 unrolling
如果只有一个元素,静态unroll 了多个元素,那就会越界访问了。如果编译器知道 bound.end() 和 bound.start() 之间有1024 个元素,那么它就敢大胆 unroll 了。理论上是可以,如果元素多,就走 unroll 分支,元素少就不走 unroll 分支。但是,要知道,编译器并不知道我们这是一个向量化的计算,它怎么会轻易做这样的优化呢?在数据库实现中,我们有一个认知误区:当我们把数据结构组织成向量后,只要写好 for 循环,编译器就会自动帮我们做好 SIMD 优化。
2024-10-23 23:35:56
526
原创 The 48 bit pointer
基于这样一个事实,在部分场景下我们可以对空闲的高 16 位加以利用,存储一些辅助 flag,这样可以让内存结构更加紧凑。为什么高 16 位总是为 0?这是因为,就目前的应用程序需求来说,只使用低 48 位已经足够。位数越少,CPU 构建成本越低。对于 ARM 处理器,可以看到下面的描述。也就是说,48 bit 不是定数,未来也可能变化。如此这样,我们就可以在 HashSlot 里存下更多信息了。的指针地址默认都只使用低 48 位,高16 位总是 0。在 Intel CPU 和 Arm CPU 中,
2024-10-17 04:29:53
434
原创 Disjunct & Conjunct Bloom Filter
Disjunct Bloom Filter:查询元素是否在任意一个集合中(“或”操作)。Conjunct Bloom Filter:查询元素是否在所有集合中(“与”操作)。这两种扩展方法都可以提高集合查询的效率,但选择哪种方法取决于具体的应用需求和场景。
2024-10-02 05:20:23
386
原创 给 git 添加扩展命令
公司里的 git 代码分支既没有和 issue 关联,也没有和 review 关联,每次找起来太费劲。于是,写个脚本吧!没想到 git 添加扩展命令这么方便,早知道这么简单,我的好多工具都做成 git 插件好了!
2024-09-25 23:04:14
732
原创 Dance with Compiler - EP3 ARM64 汇编传参约定以及 restrict 汇编分析
v0 - v7: 对于浮点数和 SIMD(单指令多数据)参数,这 8 个寄存器用于传递前 8 个浮点数参数(每个寄存器可以存储一个 64 位的浮点数,或者一组 128 位的 SIMD 数据)。x0 - x7: 这 8 个寄存器用于传递函数的前 8 个参数(对于整数类型的参数)。如果函数有更多的参数,这些额外的参数会通过栈传递。v0: 用于返回浮点数或 SIMD 类型的结果(例如,float、double、__m128 等)。x0: 用于返回整数类型的结果(例如,int、long、pointer 等)。
2024-09-09 09:53:09
817
FASS简介-抗锯齿原理
2009-01-18
同义词词林(扩展版)
2010-05-18
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅