用 DAT 重实现 CppJieba 中文分词算法,降低 99% 内存消耗

一,问题背景

中文分词应用比较广泛的开源算法,是 jieba 结巴分词,结巴分词较高性能的实现是 C++ 版本的 CppJieba : https://github.com/yanyiwu/cppjieba

在实际使用 CppJieba 的过程中,我们发现 CppJieba 的内存占用比较高。

比如对一个 76W 词 大小 11MB 的词典 ,加载 2份 (比如为了支持平滑改动用户词典)就需要耗费 505MB内存。

这对一些多进程的后台服务,浪费大量内存,难以接受,因此这里希望削减内存耗费。

经过初步调查,确定改进方法,然后动手改造,最终把 505MB 缩减到了 4.7MB ,实现了 99% 内存降低

此处也有 issue 讨论 https://github.com/yanyiwu/cppjieba/issues/3

代码稍后可能会开源出来。

GB 规模语料上的高性能新词发现算法

分词是中文搜索的重要环节,目前分词算法已经比较成熟,分词错误的主要是由于未登录词。

因此发现业务领域语料库中的新词,减少未登录词,对改善搜索引擎的用户体验有重要意义。

新词发现的一种常用算法,是 matrix67 大神 2012 年提出的 《互联网时代的社会语言学:基于SNS的文本数据挖掘》 https://www.matrix67.com/blog/archives/5044

其主要思路,是统计语料中出现的所有 ngram 子字符串的凝固度,自由度,信息熵。

算法中需要统计所有 ngram 子字符串的 左熵右熵,实现该算法时,一般以子字符串为 key,用哈希表来存。

但随着语料库变大时,内存消耗变大,

比如之前的 python 版本实现,对 200MB 的语料,就需要约 30G 内存来存哈希表,

导致单机内存不足无法运行,而且对这样规模的语料库,算法需要跑一两天才能出结果。

这里我应用一些工程实现方面的技巧, 把用哈希表统计左熵右熵的计算,拆分成多个子哈希表,分批计算,并利用多核并行,大幅度优化了算法的性能。

Proxygen http2 代码分析

Proxygen 的整体架构 image

一个 HTTPSession 对应一个 tcp 连接。

HTTPSession 中包含HTTPCodec ,HTTPCodec用来在 HTTPMessage(Request/Response) 和 字节流之间做转换(就是解析/序列化)。

一个 HTTPTransaction 对应一个 HTTP2 的Stream ,也就是一次 Req/Resp Handler 是业务逻辑处理的基类。

TrafficServer http2 代码分析

TrafficServer 是Apache基金会的 HTTP/HTTP2 代理服务器。

TrafficServer 的 HTTP2 部分主要的代码在 :

  1. trafficserver/proxy/http2/HTTP2.h, HTTP2.cc
  2. trafficserver/proxy/http2/Http2Stream.h, Http2Stream.cc
  3. trafficserver/proxy/http2/Http2ClientSession.h, Http2ClientSession.cc
  4. trafficserver/proxy/http2/Http2ConnectionState.h, Http2ConnectionState.cc
  5. trafficserver/proxy/http2/ Http2DependencyTree.h, Http2DependencyTree.cc
  6. trafficserver/proxy/http2/HPACK.h, HPACK.cc
  7. trafficserver/proxy/http2/HuffmanCodec.h, HuffmanCodec.cc

TLS协议分析 与 现代加密通信协议设计

最近发现密码学很有意思,刚好还和工作有点关系,就研究了一下,本文是其中一部分笔记和一些思考。

密码学理论艰深,概念繁多,本人知识水平有限,错误难免,如果您发现错误,请务必指出,非常感谢!

本文禁止转载

本文目标:

  1. 学习鉴赏TLS协议的设计,透彻理解原理和重点细节
  2. 跟进一下密码学应用领域的历史和进展
  3. 整理现代加密通信协议设计的一般思路

本文有门槛,读者需要对现代密码学有清晰而系统的理解,建议花精力补足背景知识再读。本文最后的参考文献里有一些很不错的学习资料。