这是一个Linux TCP SYN Cookies导致的服务端丢数据问题,其特殊之处在于:数据丢失时,协议栈、应用层socket接口均无任何报错。
注:本文来源于生产环境遇到的真实案例,在排查过程中查到了国外一个博客的资料:https://wpbolt.com/syn-cookies-ate-my-dog-breaking-tcp-on-linux/ 想了解问题根源的朋友可以直接去看资料。
本文介绍RDMA verbs函数: ibv_fork_init()
的出现原因、作用原理、局限性,并提出RDMA编程中关于fork场景的最佳实践。
在”IRResolver(STL set重叠区间以及异构查询)“里面,提到过std::set
在c++14后可以进行异构查询。这部分其实可以展开讲讲,不仅限于上述文章的用法,也不仅限于std::set
。不过我们还是以std::set
为例,毕竟这个最典型也最常用。
字典树(Trie)这一概念有时候会跟基数树(Radix Tree)、前缀树(Prefix Tree)等混用。其中前缀树、字典树是从字符串存储角度的称呼,基数树更多是从数值(多为二进制)角度的称呼,可以看作广义的字典树。以下以字典树来统称字典树和基数树。
关于字典树的介绍,前面的文章有一个直观的介绍,也不多赘述。
数据结构 | 增加 | 删除 | 精确查找 | 极值查找 | 顺序遍历 | 前缀遍历 | 数据约束 |
---|---|---|---|---|---|---|---|
哈希表 | √ | √ | √ | 哈希函数;等于比较 | |||
堆 | √ | √ | √ | 小于比较 | |||
平衡树 | √ | √ | √ | √ | √ | √ | 小于比较 |
字典树 | √ | √ | √ | √ | √ | √ | 二进制比较(字符比较) |
基础版本字典树的特点:
不足:
字典树的优化方向:
原文: https://tessil.github.io/2017/06/22/hat-trie.html
字典树 (也被称为前缀树) 是个有趣的怪物. 字典树是一种存储字符串的树形结构,一个节点的所有后代都共享相同的前缀. 这种结构可以进行快速的前缀查找, 例如查找所有以ap为前缀的单次, 并且由于共享前缀的特点,它可以采用紧凑的方式存储字符串.
跟大多数树形数据结构一样,前缀树的主流实现方法都存在缓存不友好的问题.在前缀节点之间遍历的每一步都可能会造成缓存缺失,这不利于进行快速查找。
本文中我们结合了传统字典树和缓存敏感哈希表,提出了缓存敏感的字典树:HAT-trie.
你可以从GitHub中找到 C++ 实现 ,以及一些HAT-trie同其他字典树和关联数据结构的 基准测试 .
接下来的章节, 我们首先更详细的介绍字典树的概念. 然后介绍 burst-trie 以及数组哈希表, 这些是HAT-trie所依赖的中间数据结构. 最后我们讲HAT-trie本身.
代码见 https://github.com/jiangzhuti/IRResolver
有一些区间数据:
$ head data.txt
3640-3610(s, sh) O-H stretch, free hydroxyl alcohols, phenols
3500-3200(s,b) O–H stretch, H–bonded alcohols, phenols
3400-3250(m) N–H stretch 1°, 2° amines, amides
3300-2500(m) O–H stretch carboxylic acids
3330-3270(n, s) –C≡C–H: C–H stretch alkynes (terminal)
3100-3000(s) C–H stretch aromatics
3100-3000(m) =C–H stretch alkenes
3000-2850(m) C–H stretch alkanes
2830-2695(m) H–C=O: C–H stretch aldehydes
2260-2210(v) C≡N stretch nitriles
要求给出一个数值,输出所有包含该数值的区间信息。
利用STL set构建查询树。需要注意两点: