首页   注册   登录
 roy2220 最近的时间轴更新
roy2220

roy2220

V2EX 第 309680 号会员,加入于 2018-04-18 17:46:31 +08:00
自动生成 Go 的“代理类(struct)”
分享创造  •  roy2220  •  19 天前  •  最后回复来自 saber000
4
又一个依赖注入的实现(Go)
分享创造  •  roy2220  •  32 天前  •  最后回复来自 my3157
1
B+树落盘实现(Go)
分享创造  •  roy2220  •  105 天前
B+树在线可视化操作
分享创造  •  roy2220  •  112 天前  •  最后回复来自 roy2220
3
用 go 实现一个简单的 KV 存储
  •  1   
    分享创造  •  roy2220  •  126 天前  •  最后回复来自 roy2220
    10
    在文件上实现 malloc 和 free
    分享创造  •  roy2220  •  144 天前  •  最后回复来自 zhuyie
    6
    纯内存 B 树实现(使用 Go)
    分享创造  •  roy2220  •  155 天前  •  最后回复来自 roy2220
    2
    asyncio+protobuf 实现一个轻量异步 rpc 框架
    分享创造  •  roy2220  •  2018-06-02 13:23:57 PM  •  最后回复来自 E1n
    3
    用 asyncio 实现 zookeeper 客户端
    Python  •  roy2220  •  2018-05-15 10:25:20 AM  •  最后回复来自 dishonest
    3
    roy2220 最近回复了
    23 天前
    回复了 roy2220 创建的主题 分享创造 自动生成 Go 的“代理类(struct)”
    @cc100 常见就是 AOP 、mock 这类需求
    86 天前
    回复了 GenialX2 创建的主题 程序员 数据结构与算法,我到底为什么而学?
    数据结构和算法是前人们,领域最聪明的头脑,研究留下来的瑰宝。真正热爱计算机科学的人,都会对这些"技术"叹为观止,如数家珍。因为不是每个人都拥有最聪明的头脑,但是能“白嫖”这些聪明人的智力成功,这是很幸福的事情,庆幸生在这个时代吧。这些“技术”或许在工作中用不上,但是业余造轮子一定能用上,甚至在我看来,工作很多时候都不是什么正经事,只求温饱,业余的探索才是能做一辈子的正事。
    112 天前
    回复了 roy2220 创建的主题 分享创造 B+树在线可视化操作
    @pabno 地球村
    126 天前
    回复了 roy2220 创建的主题 分享创造 用 go 实现一个简单的 KV 存储
    @nicoljiang 😂在关公面前耍剃刀了,能做出 dogedoge 是真的强👍🏻
    127 天前
    回复了 roy2220 创建的主题 分享创造 用 go 实现一个简单的 KV 存储
    @firemiles dei,自己实现的一个(比较 naive 的)存储层。详情看楼上,刚刚回复
    127 天前
    回复了 roy2220 创建的主题 分享创造 用 go 实现一个简单的 KV 存储
    @Comdex
    @ClarkAbe 再说说文件空间管理的部分,为了把问题分而治之,我做一个“文件空间分配器”的抽象,只负责分配可用的文件空间(实际上就是一个文件偏移),充当最底层的存储层。分配算法上借鉴了现代内存分配器的思想,大块空间和小块空间分开治理,大块空间(>=64kb )使用了 buddy 分配算法(用位图做标记,用红黑树做空闲块索引)。小块内存用 freelist 管理(从 buddy 上分配一大块,挂到 freelist 上按需切割),还做了一些小块内存释放后和临近的小块合并的优化,用了侵入式循环双链表作为小块内存的 overhead,把所有空闲 or 非空闲的块串在一起,实现时间复杂度 O(1)的合并。但这些思路都是传统内存分配器上借鉴的,可能不太适用在文件空间的分配上,所以这个“文件空间分配器”还有很大的改进空间
    127 天前
    回复了 roy2220 创建的主题 分享创造 用 go 实现一个简单的 KV 存储
    @Comdex 哈哈,主要是我太懒了,感觉说话(表达)比写代码还要累。。。
    实现细节还蛮多的,先说说哈希表的部分,普通的哈希表有一个致命的缺陷:当 numKeys/numBuckets 达到某个阀值( load factor )的时候,需要 rehash,这个操作会瞬间耗费大量的 cpu (而且哈希表构建在磁盘上的话,还要算上 io )。有没有办法把这个 rehash 的过程切分成一小步一小步,分摊到每次插入的操作上?这个就是<线性哈希>算法解决的问题。虽然 rehash 的过程被分摊了,但是 bucket 数组的空间还是需要连续的(不然没办法根据 hashcode 定位了),一般会采用“翻倍”的策略,让最大可用 bucket 的数量保持在 2^N。如果考虑存储海量的数据,bucket 数组空间翻倍(分配新的空间,拷贝旧数据到新空间,释放旧的空间)也是一个耗 cpu 和 io 的点。为了解决这个问题我把 bucket 数组切成固定长度的段( segment,64kb ),段与段之间不需要空间上的连续,然后额外维护一张段表(需要空间上连续)指向这些散落的段。这样就把 bucket 数组空间翻倍就弱化为段表空间翻倍,大大降低了影响。
    145 天前
    回复了 roy2220 创建的主题 分享创造 在文件上实现 malloc 和 free
    @Mithrandir 现在的方案是运行时用 mmap 地址+文件偏移定位数据块
    145 天前
    回复了 roy2220 创建的主题 分享创造 在文件上实现 malloc 和 free
    @codehz 实现上已经使用了 mmap 映射文件,但是每次内存映射的地址不确定(虽然 mmap 可以指定写死的映射地址,数据结构也就可以直接引用这个地址,因为不会变化,但是这样做太 trick ?)。还是记录文件偏移更健壮,外加使用 protobuf 做数据结构的序列化,这样大小端、内存对齐就和平台无关了
    155 天前
    回复了 roy2220 创建的主题 分享创造 纯内存 B 树实现(使用 Go)
    通过阅读源码的方式学习 Go 比较低效。建议先按官网的学习教程走,然后再看官方的 Effective Go。差不多了就可以挑一个项目进行练手了,练手过程中留意编码的最佳实践,可以多参考其他成熟的项目。后面根据自己遇到的问题,选读一些 Go 官方文档还有 Go Blog,github golang wiki 上也有不少有用的信息。大概就是一个循序渐进的过程,类似于“广度优先搜索”,不建议“深度优先搜索”的方式进行学习,例如一开始就细读所有官方文档,或者一头扎进代码堆
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2687 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 17ms · UTC 13:39 · PVG 21:39 · LAX 06:39 · JFK 09:39
    ♥ Do have faith in what you're doing.