- 博客(673)
- 资源 (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
2496
7
原创 计算血缘 ---- 一个天马星空的想法速记
在处理千亿级别大表的分组求和计算时,计算机通常采用全量扫描的方法,而人类则会根据更新的数据特征,智能地调整计算结果。为了提升计算机的智能性,可以引入“计算血缘”概念,记录每行数据与源文件的对应关系,从而在数据更新时仅重新计算相关文件,提高效率。然而,这种方法的效果取决于数据分布的集中程度。相比之下,人类基于增量计算的算法更为高效,如GIC算法和OceanBase中的“增量物化视图”技术,它们支持聚合和简单连接操作,但存在一定限制。总体而言,结合人类智能的计算方法在优化大数据处理效率方面更具潜力。
2025-05-20 03:46:30
152
原创 对 Lambda 架构问题的深入理解
答:因为 Flink 的计算有时间窗口的概念,比如:每个整点,计算上一个小时的销售额。因为队列延迟、网络出错、重试导致数据重复等原因,会让 Kafka 等队列中的数据不能完全被信任,上一个小时的数据不一定真的全了,可能有一些数据要等几分钟才到,也有可能永远不到。原因如下,特别是第一条,会让业务运营存在不确定性,为了应对这种不确定性,可能需要预留出业务余量,造成浪费。简而言之:因为实时数据不准确,那么 Serving 的到的数据肯定也不准确。• 结果第二天离线数据跑完,真实注册是 1100,实际早就达成了。
2025-05-20 00:28:18
551
原创 基于 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
208
原创 无意看到一个我20年前的帖子
http://forum.osdev.org/viewtopic.php?p=77313
2025-05-14 03:13:49
76
原创 数据库领域的 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
938
原创 局部和整体的关系
这是一个非常本质的问题,其实你已经接近数学和物理中“几何本质”的核心了。如果你愿意,我可以给你举几个现实中的例子(比如地球地图拼贴、天气预测、物理场)来加深这个理念。👉 比如我们站在地球上,只能看到脚下那一小块平面(局部),但整个地球是球体(整体)。🧩「如果我们知道每个局部是怎样的,它们又是如何连接的,那整个空间会是什么样?• 局部都像欧几里得空间(我们熟悉的直角坐标系、平面等)🧠 例子 3:人脑的理解方式(局部推理构建整体认知)• 构建出完整的空间认知(比如你能“想象”你的家)
2025-04-29 22:26:32
613
原创 GPU 架构入门笔记
引文位置:https://www.trainy.ai/blog/gpu-utilization-misleading。相关概念是通过 ChatGPT 迅速学习总结而成。
2025-04-28 23:48:00
510
原创 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
726
原创 std::move
如果写一个相关的教程,完全不应该从 std::move 入手,而是应该从如何降低对象拷贝代价入手。所以,std::move 的确什么事情都不做,它只是提示编译器,去调用支持 move 语义的函数而已,具体做事情的,是这些函数。Note:STL 中,vector 的 emplace_back、push_back 等也实现了支持 move 语义等版本。对于这种情况,就算用了 std::move,也没有什么用。有些时候,我们不希望做深拷贝。此时,下面的逻辑取决于 A 的拷贝构造函数实现,一般来说,会把。
2025-03-19 22:20:47
350
原创 DailyNotes 增加提醒功能
TODO:准备给 DailyNotes 增加一个提醒功能,准备接入 AI 来做一些事情。试了一下,非常靠谱。具体 DailyNotes 和 Ollama 的交互方式,可以直接调用命令行,也可以走网络API。
2025-03-05 23:40:24
277
原创 深入理解 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
1192
原创 支持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
194
原创 向量执行优化之手工 unrolling
如果只有一个元素,静态unroll 了多个元素,那就会越界访问了。如果编译器知道 bound.end() 和 bound.start() 之间有1024 个元素,那么它就敢大胆 unroll 了。理论上是可以,如果元素多,就走 unroll 分支,元素少就不走 unroll 分支。但是,要知道,编译器并不知道我们这是一个向量化的计算,它怎么会轻易做这样的优化呢?在数据库实现中,我们有一个认知误区:当我们把数据结构组织成向量后,只要写好 for 循环,编译器就会自动帮我们做好 SIMD 优化。
2024-10-23 23:35:56
333
原创 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
367
原创 Disjunct & Conjunct Bloom Filter
Disjunct Bloom Filter:查询元素是否在任意一个集合中(“或”操作)。Conjunct Bloom Filter:查询元素是否在所有集合中(“与”操作)。这两种扩展方法都可以提高集合查询的效率,但选择哪种方法取决于具体的应用需求和场景。
2024-10-02 05:20:23
337
原创 给 git 添加扩展命令
公司里的 git 代码分支既没有和 issue 关联,也没有和 review 关联,每次找起来太费劲。于是,写个脚本吧!没想到 git 添加扩展命令这么方便,早知道这么简单,我的好多工具都做成 git 插件好了!
2024-09-25 23:04:14
643
原创 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
515
原创 Dance with compiler - EP1
此时,我个人理解是:编译器先假设 a 总是可以信任寄存器中的值,当 b 写着块内存时,a 可以读不到最新的修改,当 b 读这块内存时,a 也不需要做任何写回操作使得 b 能读到最新数据。不过,在我们的例子里,我们通过 restrict 关键字欺骗了编译器,实际上 x 和 y 指向了同一片内存,这也导致了最终的结果错误。也是非常考验人的,需要深刻地认识到调整分支概率后编译器可能的行为是什么,才能有的放矢,不然,编译器认为,y 是以指针的形式传入函数体内,说明外部也有指针引用了 y,并且,
2024-09-07 02:58:54
684
原创 使用 Visual Studio 编辑器作为 DailyNotes 的 markdown 编辑器
除了使用 Typora 作为 markdown 编辑器,Visual Studio Code 也是一个非常不错的选择,令人惊喜的是,它也支持从剪贴板粘贴图片到 markdown 里,并且直接把图片保存到指定位置。DailyNotes 是我使用过的最优秀的日常笔记管理工具,为它配置一个好的 markdown 编辑器,可以大幅提升效率。设置方法来源:https://www.cnblogs.com/xbotter/p/17528063.html。通过下面的配置,可以让剪贴板粘贴出来的图片保存到。
2024-08-22 00:54:17
480
原创 假设我写了一段C++循环代码,我希望对这段代码做 profiling,计算出每次循环需要消耗的指令 cycle 数。我应该如何实现这种 profiling?
perf 是一个 Linux 性能分析工具,可以对运行时程序进行详细的硬件事件分析,例如 CPU cycles。perf stat 将会报告各种性能计数,包括指令周期数。使用 perf 工具 (Linux)
2024-07-22 15:03:43
356
原创 论文阅读神器 SonyDPT RP1
我个人还是觉得闲鱼比较香,因为很多人买了电纸书后,不过是三份热度,当做泡面伴侣而已,闲鱼出掉是迟早的,捡漏容易!如果预算还高点,可以去淘宝“暖风家”买,帮忙破解了系统,增加了更多格式和书籍商城的支持,甚至支持键盘鼠标。索尼把整个产品线全部卖给了富士通,去淘宝搜“富士通 电纸书” 也能搜到,新产品价格降低到了3000多点。配套 App 名称:Digital Paper App,用于在电脑上做论文同步。优点:13寸,对阅读论文非常友好!缺点:仅支持 pdf 格式,不支持 epub 等格式。
2024-07-21 22:18:02
958
原创 各种开发脚本备份
My Personal Vim & Bash Setting in OceanBase/AntFin/AlibabaNote:本文内容已做适当脱敏vimrc" call plug#begin('~/.vim/plugins')" Plug 'tomasr/molokai'" Plug 'octol/vim-cpp-enhanced-highlight'" Plug 'vim-airline/vim-airline'" "Plug 'Valloric/YouComplet
2024-07-11 13:11:49
428
原创 2024年浙江省高考分数一分一段数据可视化
不过,浙江是考两次取最大,不是很有代表性。另外,从这个图也可以看出,湖北的高分区段竞争其实非常不激烈,大部分人都只是分母而已。这和浙江形成了巨大的区别,一种可能性的猜想:湖北地区发展极不均衡,仅仅大城市才容易出高分,广大农村地区的普高孩子都是分母。而浙江经济发达,各个地区都教育的投入要高得多,所以竞争更加激烈。江苏只公布到462分以上的,但从表格趋势基本也能窥见一二,和浙江更像。下图根据 2024 年浙江高考一分一段表绘制,可以看到,竞争最激烈的分数区间在620分到480分之间。
2024-07-08 10:53:28
952
原创 如何将 gz 文件通过 local data 导入 OceanBase?
在很多领域,数据的传输是基于 csv,并且,为了方便,属于同一张表的多个 csv 文件还是打包成 gz 文件进行传输。有没有办法把 gz 文件直接导入到 OceanBase 中呢?这种方法有一个弊端:解压 gz 文件,既耗费时间,也耗费存储空间。,然后导入到数据库。这个方案在 v4.3.3 中支持。
2024-06-20 19:21:54
393
原创 OceanBase 列存中多列过滤性能解析
Hi 晓楚,帮评估个OTS替换场景 大概1亿大宽表,查询姿势就是任意字段的组合,进行等值查询+group by/sum这些聚合操作,业务模型大概是这样1亿表,过滤性最强的字段会扫50万左右数据,单SQL OTS现在不超过300毫秒,这个场景能搞定不?还比如,过滤性不确定的情况下,还可以动态地选择三个表达式中的一个来做,做一段时间发现过滤性不好,就换另一个表达式。由此推算,1亿行的场景,也一定可以满足客户对延迟的需求。再比如,在先计算哪个条件的选择上,可以选择过滤性最好的条件先做,这样就可以跳过更多的微块。
2024-06-20 00:13:40
552
原创 通过 github 分析职业研发数量
通过这个命令可以看到该数据库最近半年的 commiter 代码提交次数。将提交次数低于 10 次以下的剔除掉,剩下的就可以当做职业研发了,就能粗略估计出背后的职业研发力量。如何了解一个开源项目背后,到底有多少职业研发呢?换个角度看,依赖开源而生存的商业公司,是否应该做好信息保护呢?的范围,还可以分析出人员流动情况,非常有趣。
2024-06-19 15:26:37
410
原创 如何在 Doris 中通过外表访问 OceanBase 表
然后在 Doris 中通过外表 et1 可以访问 OceanBase 中的 t1 表。其余和 MySQL jdbc 一模一样。
2024-06-15 00:10:01
375
原创 OceanBase 并行执行参数 parallel_servers_target 理解
为了最大程度降低 PX 使用难度,OceanBase 3.1 版起,parallel_max_servers 参数废弃。用户只需用好 parallel_servers_target 即可。
2024-06-13 14:26:11
958
原创 pg_lakehouse 与 datafusion
也就是说,Postgres 基于 pg_lakehouse 做数据湖分析,计算能力主要靠 pg_lakehouse 提供,而不是主要依赖 Postgres 自身的计算引擎能力。它的出现,使得 Postgres 能够轻松访问 S3 等对象存储,轻松访问 Delta Lake 上的表格,具备数据湖分析能力。所以,从原来上看, pg_lakehouse 提供了一组访问数据湖的方法,并将这些方法和 DataFusion 的计算能力结合起来,帮助 Postgres 获得分析数据湖数据的能力。
2024-05-28 11:38:46
1511
原创 duckdb 插件机制研究
插件机制是个好东西。为了你的系统能够获得这个好东西,最好是系统在第一天设计的时候就做好抽象,把每一类系统功能都抽象成集合,每一类功能都支持“运行时可寻址”。在 OceanBase 中,最容易插件化的是系统函数,因为它数量众多,客观上从第一天起就逼迫 OceanBase 把它做成易扩展、易寻址的样子。
2024-05-27 21:16:54
1632
原创 数仓领域,Serving 是什么概念?
在数据仓库(Data Warehouse)和更广泛的数据工程领域中,“Serving”通常指的是将处理和优化后的数据提供给最终用户或应用程序的过程。这包括数据的查询、检索、展示等操作,使得数据能够在决策支持、报告、分析、或机器学习等应用中被有效使用。简而言之,数据“Serving”强调的是数据的最终用途及其可用性。
2024-05-24 18:30:12
399
FASS简介-抗锯齿原理
2009-01-18
同义词词林(扩展版)
2010-05-18
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人