返回首页
最新
作为TerarkDB的创始人(2019年被字节跳动收购),我在近年来开发了ToplingDB。
ToplingDB是基于RocksDB的一个分支,我们几乎用更高效的替代方案替换了所有组件(db_bench显示ToplingDB的性能大约比RocksDB快8倍):
* MemTable:SkipList被CSPP(Crash Safe Parallel Patricia trie)替代,速度提升了8倍。
* SST:BlockBasedTable被ToplingZipTable替代,采用可搜索的压缩算法,体积小且速度快,查找时间通常小于1微秒:
* 键/索引使用NestLoudsTrie(多层嵌套的LOUDS简洁Trie)进行压缩。
* SST中的值与zstd相比具有更好的压缩比,并且可以以每秒1GB的速度解压单个值。
* 不再需要BlockCache,避免了双重缓存(BlockCache和PageCache)。
其他热点也得到了改进:
* MemTable到L0的刷新被省略,大大减少了写放大,非常适合大(GB级)MemTable。
* MemTable作为键到“WAL日志中的值位置”的索引。
* 由于WAL文件内容几乎总是在页面缓存中,因此值内容可以通过mmap高效访问。
* 当发生刷新时,MemTable被转储为SST,WAL被视为一个blob文件。
* CSPP MemTable使用整数索引而不是物理指针,因此内存格式与文件格式完全相同。
* 前缀缓存用于搜索候选SST和通过迭代器扫描的前缀缓存:
* 将固定长度的键前缀缓存到数组中,以uint数组进行二分查找。
* 分布式压缩(优于RocksDB的远程压缩):
* 优雅地支持MergeOperator、CompactionFilter、PropertiesCollector等。
* 开箱即用,开发工作量显著减少。
* 非常容易在多个数据库节点的临时实例上共享压缩服务。
有用的额外功能:
* 通过json/yaml配置:几乎可以配置所有功能。
* 可选的嵌入式WebView:在网页浏览器中显示数据库结构,页面刷新如动画般流畅。
* 通过http在线更新数据库配置。
MySQL集成,ToplingDB通过MyTopling集成到MySQL中,MyTopling是从MyRocks分支而来,并进行了重大改进,类似于ToplingDB对RocksDB的改进:
* WBWI(WriteBatchWithIndex):像MemTable一样,SkipList被CSPP替代,速度提升20倍(加速效果超过MemTable)。
* LockManager和LockTracker:速度提升10倍。
* 编码和解码:速度提升5倍。
* 其他改进……
与InnoDB相比,MyRocks存在许多缺点,而MyTopling在几乎所有方面都优于InnoDB——不考虑功能差异。
我们为RocksDB创建了大约100个PR,其中约40个被接受。我们的PR大多是“小”改动,因为大改动不太可能被接受。
ToplingDB已在众多生产环境中部署。
欢迎大家使用ToplingDB和MyTopling,并在[此处讨论](https://github.com/topling/toplingdb/discussions)。
嗨,HN,和许多人一样,我对软件工程在编码大型语言模型(LLMs)普及后所走的方向感到兴趣。虽然我们还没有完全实现“自然语言编程”,但新的抽象概念似乎已经开始形成。为了进一步探索这一点,我构建了 semcheck(语义检查器)。这是一款简单的命令行工具,可以在持续集成(CI)或预提交时使用,检查你的实现是否符合规范,利用 LLMs 进行验证。
这个灵感来源于我在另一个项目中需要为 GeoJSON 对象设计数据结构时。我将 RFC-7946 的文本传给 Claude,它给出了一个实现方案。经过几轮的修改后,我才对这个实现感到满意,但这也意味着 RFC 对 LLM 来说失去了上下文。因此,我再次请 Claude 检查 RFC,以确保我们没有偏离规范。这让我想到,应该有一种正式的方式来定义这些检查,以便在预提交或合并请求流程中运行。
创建这个工具本身就是一个实验,旨在尝试使用 Claude Code 进行“规范驱动开发”,这是一种介于完全依赖直觉编码和传统编程之间的中间方式。我的工作流程如下:请求 AI 编写规范和实施计划,手动编辑这些内容以符合我的要求,然后逐步请求 AI 执行每一步。要小心 AI 不会偏离我认为所需的内容。我的第一个提交是配置文件结构的规范和实施计划。
一旦 semcheck 达到可以自我检查的状态,它就开始发现问题。我发现这种工作流程不仅改善了你的实现,还帮助你同时完善了规范。
除了规范,我还开始在我的规则中包含文档,确保我在 README.md 文件中的配置示例和命令行标志与实现保持一致。
最好的地方是,你可以将发现的问题直接放回你的 AI 编辑器中,进行快速迭代。
一些经验教训:
- LLMs 在发现差异方面非常有效,只要你传递给比较函数的文件数量不是太大,换句话说,真正的正面结果相当不错。
- 假阳性:LLM 是个“万事通”(字面意思),常常认为自己知道得更多。LLM 渴望利用自己的世界知识来发现错误,这既有好处也有问题。我常常听到它抱怨我的 Go 版本不存在,但那只是因为它在该模型的知识截止日期之后才发布。我特别提示模型只找出差异,但它往往还是“选择”使用自己的知识。
- 为了减少假阳性,我要求模型给出一个置信度评分(0-1),以指示它对发现的问题在该场景下是否适用的确定性。模型总是非常自信,输出的值几乎都大于 0.7。
- 一件显著减少假阳性的方法是要求模型在为发现的问题分配严重性等级之前先给出其推理。
- 在我的(初步)实验中,我发现“思考型”模型如 O3 在性能上并没有显著提升,不值得额外的代币/时间。(可能是因为我已经要求推理了)
- 表现最佳的模型是 Claude 4 和 GPT-4.1。
如果你觉得这对你的工作流程有用,请告诉我,并告诉我你需要什么功能来使其正常运作。
日本以其严酷的工作环境而闻名。我可以保证这是真的,因为我是一名日本人,几十年前我曾在恶劣的工作环境中工作。连续工作了三天的夜班。我感到沮丧,这很自然。在日本,许多人因工作、骚扰和自杀而痛苦。我认为我们应该改变这种荒谬的环境。可能在世界各地,很多人面临着类似的情况。请告诉我你的工作环境。
嘿,我想和大家分享一个我用Lovable在一天内构建并部署的应用程序。
作为创始人,我一直想要一个顾问,但我的预算总是有限。另一方面,我有保罗关于创业建议的文章,但因为忙于开发项目,我从未阅读过。
因此,我构建了这个产品,它在合理性和能力上都比其他选择更具优势。
顺便说一下,它运行在一个推理模型上,老实说,我从中获得了相当不错的见解。
给PG的备注:如果你看到这个,我是你的忠实粉丝。感谢你所做的一切。