Leveldb源码解读------Memtable(跳表)详解
在leveldb中的memtable实际上是对核心数据结构skipList做了一个包装,并对外提供了接口。
使用让我们一起来研究一下跳表
为什么使用跳表
因为memtable为了更快的查询,是一个sortmap要求。一般会采用红黑树,不过LevelDB采用的是Skiplist。Skiplist是一种概率性的数据结构,支持SortedMap
的所有功能,性能和红黑树相当
实现源码分析
// Writes require external synchronization, most likely a mutex.
// Reads require a guarantee that the SkipList will not be destroyed
// while the read is in progress. Apart from that, reads progress
// without any internal locking or synchronization.
//
// Invariants:
//
// (1) Allocated nodes are never deleted until the SkipList is
// destroyed. This is trivially guaranteed by the code since we
// never delete any skip list nodes.
//
// (2) The contents of a Node except for the next/prev pointers are
// immutable after the Node has been linked into the SkipList.
// Only Insert() modifies the list, and it is careful to initialize
// a node and use release-stores to publish the nodes in one or
// more lists.
//
// ... prev vs. next pointer ordering ...
在文件的开头有这么一段话:也就是说对于读来说,不一定能看到最新写的,但这也没关系。原因可以在后文看到。这样提高了效率
skipList的最大高度是12,然后因为这是可变长的数组,所以Node有一个成员记录了每一层的下一个。
template <typename Key, class Comparator>
int SkipList<Key, Comparator>::RandomHeight() {// Increase height with probability 1 in kBranchingstatic const unsigned int kBranching = 4;int height = 1;while (height < kMaxHeight && rnd_.OneIn(kBranching)) {height++;}assert(height > 0);assert(height <= kMaxHeight);return height;
}
在leveldb中每上升一层的概率是1/4
// Array of length equal to the node height. next_[0] is lowest level link.std::atomic<Node*> next_[1];
因为是柔性数组,我们要预先分配足够的空间,不然就会写越界,于是一般来说我们要预先分配,同时内存对齐
template <typename Key, class Comparator>
typename SkipList<Key, Comparator>::Node* SkipList<Key, Comparator>::NewNode(const Key& key, int height) {char* const node_memory = arena_->AllocateAligned(sizeof(Node) + sizeof(std::atomic<Node*>) * (height - 1));return new (node_memory) Node(key);
}
template <typename Key, class Comparator>
typename SkipList<Key, Comparator>::Node*
SkipList<Key, Comparator>::FindGreaterOrEqual(const Key& key,Node** prev) const {Node* x = head_;int level = GetMaxHeight() - 1;while (true) {Node* next = x->Next(level);if (KeyIsAfterNode(key, next)) {// Keep searching in this listx = next;} else {if (prev != nullptr) prev[level] = x;if (level == 0) {return next;} else {// Switch to next listlevel--;}}}
}
每一层主要是找到最大的比该节点小的,然后把pre指向他。
template <typename Key, class Comparator>
void SkipList<Key, Comparator>::Insert(const Key& key) {// TODO(opt): We can use a barrier-free variant of FindGreaterOrEqual()// here since Insert() is externally synchronized.Node* prev[kMaxHeight];Node* x = FindGreaterOrEqual(key, prev);// Our data structure does not allow duplicate insertionassert(x == nullptr || !Equal(key, x->key));int height = RandomHeight();if (height > GetMaxHeight()) {for (int i = GetMaxHeight(); i < height; i++) {prev[i] = head_;}// It is ok to mutate max_height_ without any synchronization// with concurrent readers. A concurrent reader that observes// the new value of max_height_ will see either the old value of// new level pointers from head_ (nullptr), or a new value set in// the loop below. In the former case the reader will// immediately drop to the next level since nullptr sorts after all// keys. In the latter case the reader will use the new node.max_height_.store(height, std::memory_order_relaxed);}x = NewNode(key, height);for (int i = 0; i < height; i++) {// NoBarrier_SetNext() suffices since we will add a barrier when// we publish a pointer to "x" in prev[i].x->NoBarrier_SetNext(i, prev[i]->NoBarrier_Next(i));prev[i]->SetNext(i, x);}
}
先生产这个节点的高度,如果在一定概率下,比当前节点高,那么,高的部分pre直接指向头部就行了。然后关于next,我们就是想单链表一样对每一个level进行处理就行了。最大高度可以不同步,因为如果没有看到最大高度的话,但是别的更新了,那么以原来的操作来看,小的height也可以不出错的完成任务。
Memtable是怎么处理上层请求并调用skipList的
为了保证skipList生存周期和memtable一致,我们一般把skipLIst作为memtable的成员来达到目的。
private:friend class MemTableIterator;friend class MemTableBackwardIterator;struct KeyComparator {const InternalKeyComparator comparator;explicit KeyComparator(const InternalKeyComparator& c) : comparator(c) {}int operator()(const char* a, const char* b) const;};typedef SkipList<const char*, KeyComparator> Table;~MemTable(); // Private since only Unref() should be used to delete itKeyComparator comparator_;int refs_;Arena arena_;Table table_;
然后table的构造要用到arena,所以arena的申明需要在table之前。同时,memtable是个不可复制的引用计数(如果是可复制的话,比如share_ptr, count应该是个指向数的指针,这样才能做到多个对象的计数同步),所以用个ref来记录,ref变为0时,就可以销毁。
因为我们这个skipList是不是kv的所以,我们要把key和value生产一个key来插入
比较器的说明
// A comparator for internal keys that uses a specified comparator for
// the user key portion and breaks ties by decreasing sequence number.
同时这个结构里面也提供了一个迭代器,方便操作。可以看到的是,这个迭代器里面存了跳表的迭代器,就是转调操作。
class MemTableIterator : public Iterator {public:explicit MemTableIterator(MemTable::Table* table) : iter_(table) {}MemTableIterator(const MemTableIterator&) = delete;MemTableIterator& operator=(const MemTableIterator&) = delete;~MemTableIterator() override = default;bool Valid() const override { return iter_.Valid(); }void Seek(const Slice& k) override { iter_.Seek(EncodeKey(&tmp_, k)); }void SeekToFirst() override { iter_.SeekToFirst(); }void SeekToLast() override { iter_.SeekToLast(); }void Next() override { iter_.Next(); }void Prev() override { iter_.Prev(); }Slice key() const override { return GetLengthPrefixedSlice(iter_.key()); }Slice value() const override {Slice key_slice = GetLengthPrefixedSlice(iter_.key());return GetLengthPrefixedSlice(key_slice.data() + key_slice.size());}Status status() const override { return Status::OK(); }private:MemTable::Table::Iterator iter_;std::string tmp_; // For passing to EncodeKey
};
add操作就是把key, value和操作类型,sequnceNumber柔成一个buf,插入到skipList里面。
void MemTable::Add(SequenceNumber s, ValueType type, const Slice& key,const Slice& value) {// Format of an entry is concatenation of:// key_size : varint32 of internal_key.size()// key bytes : char[internal_key.size()]// tag : uint64((sequence << 8) | type)// value_size : varint32 of value.size()// value bytes : char[value.size()]size_t key_size = key.size();size_t val_size = value.size();size_t internal_key_size = key_size + 8;const size_t encoded_len = VarintLength(internal_key_size) +internal_key_size + VarintLength(val_size) +val_size;char* buf = arena_.Allocate(encoded_len);char* p = EncodeVarint32(buf, internal_key_size);std::memcpy(p, key.data(), key_size);p += key_size;EncodeFixed64(p, (s << 8) | type);p += 8;p = EncodeVarint32(p, val_size);std::memcpy(p, value.data(), val_size);assert(p + val_size == buf + encoded_len);table_.Insert(buf);
}
读取也是按之前的格式来的,key_length包含了tag的内容。如果没有对应的key的话,就返回false,如果有对应的key并且是删除的话,就status设成notFound。
bool MemTable::Get(const LookupKey& key, std::string* value, Status* s) {Slice memkey = key.memtable_key();Table::Iterator iter(&table_);iter.Seek(memkey.data());if (iter.Valid()) {// entry format is:// klength varint32// userkey char[klength]// tag uint64// vlength varint32// value char[vlength]// Check that it belongs to same user key. We do not check the// sequence number since the Seek() call above should have skipped// all entries with overly large sequence numbers.const char* entry = iter.key();uint32_t key_length;const char* key_ptr = GetVarint32Ptr(entry, entry + 5, &key_length);if (comparator_.comparator.user_comparator()->Compare(Slice(key_ptr, key_length - 8), key.user_key()) == 0) {// Correct user keyconst uint64_t tag = DecodeFixed64(key_ptr + key_length - 8);switch (static_cast<ValueType>(tag & 0xff)) {case kTypeValue: {Slice v = GetLengthPrefixedSlice(key_ptr + key_length);value->assign(v.data(), v.size());return true;}case kTypeDeletion:*s = Status::NotFound(Slice());return true;}}}return false;
}
思考
leveldb跳表节点不直接设计成kv类型的,而要把kv类型揉成一个key,这样还要记录下k和v的长度,还要编码和解码的开销,是不是不太优雅?
不是的,因为kv的话,实际上存的是指针,可能不挨着。实际上这还不是重点,并发情况下,k,v就可能分开,对cache不friendly。而揉搓成一个就没这个问题。
同是我们观察到这个arean_是memtable独有的,这样更有利于cache。
相关文章
- 使用FSL对DTI数据进行预处理
使用FSL对DTI数据进行预处理 一、topup处理二、eddy处理一、topup处理 为了校正磁场引起的畸变,对DTI的B0像分别采集了A>P和P>A的反向编码的两种B0像。利用AP和PA图像进行一个topup处理,校正畸变。 1、 使用dcm2niix将AP PA图像转为nii格式 假设转换后的图像为sub01_…...
2023/5/28 19:55:46 - DAY 69 rsync远程同步
rsync介绍 rsync简介 rsync(Remote Sync,远程同步)是一个开源的快速备份工具,可以在不同主机之间镜像同步整个目录树,支持增量备份,并保持链接和权限,且采用优化的同步算法,传输前…...
2023/5/28 19:55:07 - JS中this的指向
JS中this的指向 本文目录 JS中this的指向全局上下文(Global Context)函数上下文(Function Context)普通函数调用作为对象的方法调用构造函数调用箭头函数回调函数 事件处理器上下文(Event Handler Context)…...
2023/5/28 19:53:53 - 如何在华为OD机试中获得满分?Java实现【查找两个字符串a,b中的最长公共子串】一文详解!
✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1、题目描述2、输入描述3、输出描述…...
2023/5/28 19:48:10 - OS之磁盘调度算法
目录 一、先来先服务(FCFS) 基本思想 案例 二、最短寻道时间优先(SSTF) 基本思想 案例 饥饿现象 三、扫描算法(SCAN) 基本思想 案例 四、循环扫描算法(CSCAN) 基本思想 案例 一、先来先服务(FCFS) 基本思想 根据进程请求访问磁盘的先后次序来进行调度 案例 二、…...
2023/5/28 19:40:46 - leetcode解题思路分析(一百四十)1201 - 1208 题
丑数3 给你四个整数:n 、a 、b 、c ,请你设计一个算法来找出第 n 个丑数。丑数是可以被 a 或 b 或 c 整除的 正整数 。 容斥原理二分法 class Solution { public:int nthUglyNumber(int n, int a, int b, int c) {long long ab lcm((long long)a, (lo…...
2023/5/28 19:39:19 - 9. Linux下实现简单的UDP请求
本文简单介绍了UDP传输层协议,并在Linux下实现简单的socket通讯 一、UDP UDP(User Datagram Protocol,用户数据报协议)是一种无连接的传输层协议,它不保证数据包的可靠性和顺序。UDP在IP协议的基础上增加了简单的差错…...
2023/5/28 19:37:42 - 如何在华为OD机试中获得满分?Java实现【24点游戏算法】一文详解!
✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1、题目描述2、输入描述3、输出描述…...
2023/5/28 19:36:41 - C#,码海拾贝(26)——求解“一般带状线性方程组”之C#源代码,《C#数值计算算法编程》源代码升级改进版
using System; namespace Zhou.CSharp.Algorithm { /// <summary> /// 求解线性方程组的类 LEquations /// 原作 周长发 /// 改编 深度混淆 /// </summary> public static partial class LEquations { /// <summary> /…...
2023/5/28 19:35:11 - 关于linux系统can收发,以及jetson系列can收发的说明,以及SN65HVD230 CAN board和MCP2515和TJA1050的区别是什么?
1,jetson orin、Tx2有can处理器,没有收发器 所以官方推荐用SN65HVD230 CAN board就可以了。理论上单独的TJA1050也是可以的。。。 2,如果本身没有can像jetson nano、香橙派这样,就需要使用MCP2515和TJA1050的结合体了 SN65HVD230…...
2023/5/28 19:34:24 - vue3项目创建步骤,以及项目运行失败的原因和解决方法
vue3项目创建步骤,以及项目运行失败的原因和解决方法 vue3项目创建前提:搭建node.js环境第一步:创建一个空文件夹第二步:打开空文件夹,如图所示第三步:在此输入cmd,并按下回车键,进入…...
2023/5/28 19:25:53 - QMI8658 - 姿态传感器学习笔记 - Ⅲ
文章目录 1.复位1.1 上电复位:1.2 推荐工作条件 2. 校准(COD)2.1 校准步骤2.2 校准注意事项:2.3 校准状态指示2.4 校准参数更新 3. 自检3.1 加速度计自检3.2 陀螺仪自检 4. Ctrl94.1 写Ctrl94.2 读Ctrl94.3 Ctrl9详细命令说明 5. 中断5.1 同步采样模式5.…...
2023/5/28 19:23:58 - vscode配置flutter开发环境,不需要安装第三方安卓模拟器
1.获取Flutter SDK 点击下方的安装包,获取 stable 发行通道的 Flutter SDK 最新版本:Flutter SDK 将压缩包解压,然后把其中的 flutter 目录整个放在你想放置 Flutter SDK 的路径中**(注意不要出现中文目录)** 配置Wi…...
2023/5/28 19:20:09 - 杨立昆:科学之路读书笔记2
杨立昆:科学之路读书笔记2 人工智能的低谷人工智能无所不能吗?谁将从AI人工智能革命中获益结语 一起学AI系列博客:目录索引 人工智能的低谷 上回分享了读书缘由,杨立昆的背景及其对人工智能的研究看法,这回分享他如何…...
2023/5/28 19:19:33 - 老板让你Excel统计数据无从下手?没事,ChatGPT来帮你!
系列文章目录 老板让你写个PPT没有头绪?没事,ChatGPT来帮你!传送门 文章目录 系列文章目录前言一、不会公式?帮你生成二、不会处理数据?帮你处理写在最后 前言 自从人工智能横空而出,它在人们的生活中产生…...
2023/5/28 19:13:19 - C语言中的类型转换
C语言中的类型转换 隐式类型转换 整型提升 概念: C语言的整型算术运算总是至少以缺省(默认)整型类型的精度来进行的为了获得这个精度,表达式中字符和短整型操作数在使用之前被转换为普通整型,这种转换成为整型提升 如…...
2023/5/28 19:10:27 - 华为OD机试之真正的密码(Java源码)
真正的密码 题目描述 一行中输入一个字符串数组,如果其中一个字符串的所有以索引0开头的子串在数组中都有,那么这个字符串就是潜在密码在所有潜在密码中最长的是真正的密码,如果有多个长度相同的真正的密码,那么取字典序最大的为…...
2023/5/28 19:08:59 - 互联网摸鱼日报(2023-05-28)
互联网摸鱼日报(2023-05-28) InfoQ 热门话题 蚂蚁集团开源生态构建与基础软件技术开源布局 百度回应Bing成中国桌面搜索第一;阿里回应大裁员传闻;文心一言市场负责人怒怼科大讯飞|Q资讯 微步在线CEO薛锋:…...
2023/5/28 19:07:21 - Java设计模式-中介者模式
简介 在软件开发中,设计模式是一种被广泛使用的技术,它提供了解决常见问题的可重用方案。中介者模式是其中之一,它通过引入一个中介对象,将各个对象之间的交互解耦,以实现更松散耦合和可维护的系统。 访问者模式是一…...
2023/5/28 19:04:31 - 真相只有一个——谁是凶手
谁是凶手 1.题目描述2. 解题思路3.代码展示 所属专栏:脑筋急转弯❤️ 🚀 >博主首页:初阳785❤️ 🚀 >代码托管:chuyang785❤️ 🚀 >感谢大家的支持,您的点赞和关注是对我最大的支持&am…...
2023/5/28 19:01:13 - Git常见命令快速参考
本文是笔者学习廖雪峰的Git教程记录的笔记,算是对其内容的精简,仅供查询和回顾之用。若有疏漏,还请查看其原文。 基本概念 Git进行版本控制,管理的是修改而非文件。分清楚工作区,版本库,暂存区(stage)就能…...
2023/5/28 18:57:32 - unix环境高级编程 第一章 UNIX基础知识 Go实现代码
ls命令的Go语言实现 package mainimport ("fmt""os" )func main() {if len(os.Args) ! 2 {panic("参数数量不足")}targetPath : os.Args[1]if dirList, err : os.ReadDir(targetPath); err nil {for _, dirInfo : range dirList {fmt.Println(…...
2023/5/28 18:54:42 - 【算法训练(day6)】双指针模板
一.双指针算法的由来和使用场景 通常情况下我们可能会遇到在某些可遍历的集合中寻找满足某种性质的字串或元素。这时候我们采取暴力的思路就会面临多重循环。我们可以利用题目中所给的集合并利用其性质将多重循环降成一重循环。光用语言描述可能不太好理解。接下来看几个双指针…...
2023/5/28 18:53:58 - C#,码海拾贝(23)——求解“复系数线性方程组“的“全选主元高斯消去法“之C#源代码,《C#数值计算算法编程》源代码升级改进版
using System; namespace Zhou.CSharp.Algorithm { /// <summary> /// 求解线性方程组的类 LEquations /// 原作 周长发 /// 改编 深度混淆 /// </summary> public static partial class LEquations { /// <summary&g…...
2023/5/28 18:48:35 - K8s in Action 阅读笔记——【5】Services: enabling clients to discover and talk to pods
K8s in Action 阅读笔记——【5】Services: enabling clients to discover and talk to pods 你已了解Pod以及如何通过ReplicaSets等资源部署它们以确保持续运行。虽然某些Pod可以独立完成工作,但现今许多应用程序需要响应外部请求。例如,在微服务的情况…...
2023/5/28 18:44:46 - 中文核心论文写作经验总结和工具推荐
中文核心论文写作经验总结和工具推荐 1 写作问题案例及解决方法1.1 方法介绍部分冗长杂乱1.2 实验结果介绍没有逻辑1.3 文章整体逻辑把握不清1.4 英文过于中式和口水化 2 投稿流程经验3 工具4 总结 1 写作问题案例及解决方法 1.1 方法介绍部分冗长杂乱 自身问题:介…...
2023/5/28 18:43:16 - jQuery-从左到右、从右到左
<!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetUTF-8"> <title>从左到右、从右到左</title> <style type"text/css"> select { …...
2023/5/28 18:39:19 - 《The Element of Style》阅读笔记 —— 章节 III A Few Matters of Form
前言:本篇为书籍《The Element of Style》第三章的阅读笔记。 本书电子版链接:http://www.jlakes.org/ch/web/The-elements-of-style.pdf 章节 I Elementary Rules of Usage 阅读笔记:链接章节 II Elementary Principles of Composition 阅读…...
2023/5/28 18:37:42 - js实例化一个对象过程
实例化一个对象的过程发生了什么? 新建一个新的空对象 将this指向这个对象 将prototype上的值赋给对象 返回这个对象 上面是答案,我是因为遇到以下的问题发生了新的思考: 实现链式调用myCalculator(121).add(1).minus(2).multi(3).div(…...
2023/5/28 18:24:52 - 每日学术速递5.28
CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CL 1.Improving Factuality and Reasoning in Language Models through Multiagent Debate 标题:通过多主体辩论改进语言模型中的事实性和推理 作者:Yilun Du,…...
2023/5/28 18:22:41
最新文章
- 使用FSL对DTI数据进行预处理
使用FSL对DTI数据进行预处理 一、topup处理二、eddy处理一、topup处理 为了校正磁场引起的畸变,对DTI的B0像分别采集了A>P和P>A的反向编码的两种B0像。利用AP和PA图像进行一个topup处理,校正畸变。 1、 使用dcm2niix将AP PA图像转为nii格式 假设转换后的图像为sub01_…...
2023/5/28 19:55:46 - DAY 69 rsync远程同步
rsync介绍 rsync简介 rsync(Remote Sync,远程同步)是一个开源的快速备份工具,可以在不同主机之间镜像同步整个目录树,支持增量备份,并保持链接和权限,且采用优化的同步算法,传输前…...
2023/5/28 19:55:07 - JS中this的指向
JS中this的指向 本文目录 JS中this的指向全局上下文(Global Context)函数上下文(Function Context)普通函数调用作为对象的方法调用构造函数调用箭头函数回调函数 事件处理器上下文(Event Handler Context)…...
2023/5/28 19:53:53 - 如何在华为OD机试中获得满分?Java实现【查找两个字符串a,b中的最长公共子串】一文详解!
✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1、题目描述2、输入描述3、输出描述…...
2023/5/28 19:48:10 - OS之磁盘调度算法
目录 一、先来先服务(FCFS) 基本思想 案例 二、最短寻道时间优先(SSTF) 基本思想 案例 饥饿现象 三、扫描算法(SCAN) 基本思想 案例 四、循环扫描算法(CSCAN) 基本思想 案例 一、先来先服务(FCFS) 基本思想 根据进程请求访问磁盘的先后次序来进行调度 案例 二、…...
2023/5/28 19:40:46 - leetcode解题思路分析(一百四十)1201 - 1208 题
丑数3 给你四个整数:n 、a 、b 、c ,请你设计一个算法来找出第 n 个丑数。丑数是可以被 a 或 b 或 c 整除的 正整数 。 容斥原理二分法 class Solution { public:int nthUglyNumber(int n, int a, int b, int c) {long long ab lcm((long long)a, (lo…...
2023/5/28 19:39:19 - 9. Linux下实现简单的UDP请求
本文简单介绍了UDP传输层协议,并在Linux下实现简单的socket通讯 一、UDP UDP(User Datagram Protocol,用户数据报协议)是一种无连接的传输层协议,它不保证数据包的可靠性和顺序。UDP在IP协议的基础上增加了简单的差错…...
2023/5/28 19:37:42 - 如何在华为OD机试中获得满分?Java实现【24点游戏算法】一文详解!
✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1、题目描述2、输入描述3、输出描述…...
2023/5/28 19:36:41 - C#,码海拾贝(26)——求解“一般带状线性方程组”之C#源代码,《C#数值计算算法编程》源代码升级改进版
using System; namespace Zhou.CSharp.Algorithm { /// <summary> /// 求解线性方程组的类 LEquations /// 原作 周长发 /// 改编 深度混淆 /// </summary> public static partial class LEquations { /// <summary> /…...
2023/5/28 19:35:11 - 关于linux系统can收发,以及jetson系列can收发的说明,以及SN65HVD230 CAN board和MCP2515和TJA1050的区别是什么?
1,jetson orin、Tx2有can处理器,没有收发器 所以官方推荐用SN65HVD230 CAN board就可以了。理论上单独的TJA1050也是可以的。。。 2,如果本身没有can像jetson nano、香橙派这样,就需要使用MCP2515和TJA1050的结合体了 SN65HVD230…...
2023/5/28 19:34:24 - vue3项目创建步骤,以及项目运行失败的原因和解决方法
vue3项目创建步骤,以及项目运行失败的原因和解决方法 vue3项目创建前提:搭建node.js环境第一步:创建一个空文件夹第二步:打开空文件夹,如图所示第三步:在此输入cmd,并按下回车键,进入…...
2023/5/28 19:25:53 - QMI8658 - 姿态传感器学习笔记 - Ⅲ
文章目录 1.复位1.1 上电复位:1.2 推荐工作条件 2. 校准(COD)2.1 校准步骤2.2 校准注意事项:2.3 校准状态指示2.4 校准参数更新 3. 自检3.1 加速度计自检3.2 陀螺仪自检 4. Ctrl94.1 写Ctrl94.2 读Ctrl94.3 Ctrl9详细命令说明 5. 中断5.1 同步采样模式5.…...
2023/5/28 19:23:58 - vscode配置flutter开发环境,不需要安装第三方安卓模拟器
1.获取Flutter SDK 点击下方的安装包,获取 stable 发行通道的 Flutter SDK 最新版本:Flutter SDK 将压缩包解压,然后把其中的 flutter 目录整个放在你想放置 Flutter SDK 的路径中**(注意不要出现中文目录)** 配置Wi…...
2023/5/28 19:20:09 - 杨立昆:科学之路读书笔记2
杨立昆:科学之路读书笔记2 人工智能的低谷人工智能无所不能吗?谁将从AI人工智能革命中获益结语 一起学AI系列博客:目录索引 人工智能的低谷 上回分享了读书缘由,杨立昆的背景及其对人工智能的研究看法,这回分享他如何…...
2023/5/28 19:19:33 - 老板让你Excel统计数据无从下手?没事,ChatGPT来帮你!
系列文章目录 老板让你写个PPT没有头绪?没事,ChatGPT来帮你!传送门 文章目录 系列文章目录前言一、不会公式?帮你生成二、不会处理数据?帮你处理写在最后 前言 自从人工智能横空而出,它在人们的生活中产生…...
2023/5/28 19:13:19 - C语言中的类型转换
C语言中的类型转换 隐式类型转换 整型提升 概念: C语言的整型算术运算总是至少以缺省(默认)整型类型的精度来进行的为了获得这个精度,表达式中字符和短整型操作数在使用之前被转换为普通整型,这种转换成为整型提升 如…...
2023/5/28 19:10:27 - 华为OD机试之真正的密码(Java源码)
真正的密码 题目描述 一行中输入一个字符串数组,如果其中一个字符串的所有以索引0开头的子串在数组中都有,那么这个字符串就是潜在密码在所有潜在密码中最长的是真正的密码,如果有多个长度相同的真正的密码,那么取字典序最大的为…...
2023/5/28 19:08:59 - 互联网摸鱼日报(2023-05-28)
互联网摸鱼日报(2023-05-28) InfoQ 热门话题 蚂蚁集团开源生态构建与基础软件技术开源布局 百度回应Bing成中国桌面搜索第一;阿里回应大裁员传闻;文心一言市场负责人怒怼科大讯飞|Q资讯 微步在线CEO薛锋:…...
2023/5/28 19:07:21 - Java设计模式-中介者模式
简介 在软件开发中,设计模式是一种被广泛使用的技术,它提供了解决常见问题的可重用方案。中介者模式是其中之一,它通过引入一个中介对象,将各个对象之间的交互解耦,以实现更松散耦合和可维护的系统。 访问者模式是一…...
2023/5/28 19:04:31 - 真相只有一个——谁是凶手
谁是凶手 1.题目描述2. 解题思路3.代码展示 所属专栏:脑筋急转弯❤️ 🚀 >博主首页:初阳785❤️ 🚀 >代码托管:chuyang785❤️ 🚀 >感谢大家的支持,您的点赞和关注是对我最大的支持&am…...
2023/5/28 19:01:13 - Git常见命令快速参考
本文是笔者学习廖雪峰的Git教程记录的笔记,算是对其内容的精简,仅供查询和回顾之用。若有疏漏,还请查看其原文。 基本概念 Git进行版本控制,管理的是修改而非文件。分清楚工作区,版本库,暂存区(stage)就能…...
2023/5/28 18:57:32 - unix环境高级编程 第一章 UNIX基础知识 Go实现代码
ls命令的Go语言实现 package mainimport ("fmt""os" )func main() {if len(os.Args) ! 2 {panic("参数数量不足")}targetPath : os.Args[1]if dirList, err : os.ReadDir(targetPath); err nil {for _, dirInfo : range dirList {fmt.Println(…...
2023/5/28 18:54:42 - 【算法训练(day6)】双指针模板
一.双指针算法的由来和使用场景 通常情况下我们可能会遇到在某些可遍历的集合中寻找满足某种性质的字串或元素。这时候我们采取暴力的思路就会面临多重循环。我们可以利用题目中所给的集合并利用其性质将多重循环降成一重循环。光用语言描述可能不太好理解。接下来看几个双指针…...
2023/5/28 18:53:58 - C#,码海拾贝(23)——求解“复系数线性方程组“的“全选主元高斯消去法“之C#源代码,《C#数值计算算法编程》源代码升级改进版
using System; namespace Zhou.CSharp.Algorithm { /// <summary> /// 求解线性方程组的类 LEquations /// 原作 周长发 /// 改编 深度混淆 /// </summary> public static partial class LEquations { /// <summary&g…...
2023/5/28 18:48:35 - K8s in Action 阅读笔记——【5】Services: enabling clients to discover and talk to pods
K8s in Action 阅读笔记——【5】Services: enabling clients to discover and talk to pods 你已了解Pod以及如何通过ReplicaSets等资源部署它们以确保持续运行。虽然某些Pod可以独立完成工作,但现今许多应用程序需要响应外部请求。例如,在微服务的情况…...
2023/5/28 18:44:46 - 中文核心论文写作经验总结和工具推荐
中文核心论文写作经验总结和工具推荐 1 写作问题案例及解决方法1.1 方法介绍部分冗长杂乱1.2 实验结果介绍没有逻辑1.3 文章整体逻辑把握不清1.4 英文过于中式和口水化 2 投稿流程经验3 工具4 总结 1 写作问题案例及解决方法 1.1 方法介绍部分冗长杂乱 自身问题:介…...
2023/5/28 18:43:16 - jQuery-从左到右、从右到左
<!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetUTF-8"> <title>从左到右、从右到左</title> <style type"text/css"> select { …...
2023/5/28 18:39:19 - 《The Element of Style》阅读笔记 —— 章节 III A Few Matters of Form
前言:本篇为书籍《The Element of Style》第三章的阅读笔记。 本书电子版链接:http://www.jlakes.org/ch/web/The-elements-of-style.pdf 章节 I Elementary Rules of Usage 阅读笔记:链接章节 II Elementary Principles of Composition 阅读…...
2023/5/28 18:37:42 - js实例化一个对象过程
实例化一个对象的过程发生了什么? 新建一个新的空对象 将this指向这个对象 将prototype上的值赋给对象 返回这个对象 上面是答案,我是因为遇到以下的问题发生了新的思考: 实现链式调用myCalculator(121).add(1).minus(2).multi(3).div(…...
2023/5/28 18:24:52 - 每日学术速递5.28
CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CL 1.Improving Factuality and Reasoning in Language Models through Multiagent Debate 标题:通过多主体辩论改进语言模型中的事实性和推理 作者:Yilun Du,…...
2023/5/28 18:22:41 - 【ChatGPT】从零开始构建基于ChatGPT的嵌入式(Embedding) 本地(Local) 智能客服问答机器人模型
目录 方案流程 1. Embeddings 介绍 术语:微调 vs 嵌入 一句话理解便是:embedding model 可以将文本转换为固定长度的连续向量。 架构流程图 3、Qdrant云数据库的搭建 3.1、初识Qdrant 3.2、创建云数据库 3.3、通过curl 接口访问 4、写入测试数…...
2023/5/28 17:16:05 - 【ChatGPT】在20分钟内使用 LangChain + Ray构建自托管问答服务
This is part 3 of a blog series. In this blog, we’ll show you how to build an LLM question and answering service. In future parts, we will optimize the code and measure performance: cost, latency and throughput. 这是博客系列的第 3 部分。在本博客中,我们将…...
2023/5/28 15:14:53 - 【ChatGPT】Turbocharge LangChain: guide to 20x faster embedding | LangChain: 嵌入速度提高 20 倍的指南
目录 Why do I need to parallelize this?为什么我需要并行化它? Stages of our Data Pipeline 数据管道的各个阶段 Execution...
2023/5/28 15:06:52 - 最新ChatGPT GPT-4 相似匹配Embedding技术详解(附ipynb与python源码及视频讲解)——开源DataWhale发布入门ChatGPT技术新手从0到1必备使用指南手册(一)
目录 前言最新ChatGPT GPT-4 相似匹配Embedding技术详解1. 何为Embedding2. 相关API2.1 LMAS Embedding API2.2 ChatGPT Style 3. Embedding应用3.1 QA3.2 聚类3.3 推荐 相关文献 参考资料其它资料下载 前言 如果您想提高ChatGPT中文本处理的效率和精度,那么Embedd…...
2023/5/28 12:45:09 - ChatGPT的access_token获取(最新!!!)
ChatGPT的access_token获取(最新!!!) 序言 最近在搞移动应用开发,心血来潮写了个chatGPT的app,但是接口只能用官网提供的,我自己的号没有免费额度,朋友的号也就5$的额度…...
2023/5/28 12:19:58 - 【ChatGPT】ChatGPT 在智能客服产品如何落地?
目录 简介 智能客服产品的典型特征 人力密集: 数据密集: 流程可定义:...
2023/5/28 12:15:11 - 【ChatGPT】ChatGPT使用指南——句词分类
目录 ChatGPT使用指南——句词分类 1. NLU基础 1.1 句子级别的分类 1.2 Token级别的分类 2. 相关API...
2023/5/28 11:56:24 - 【ChatGPT】技术原理:ChatGPT怎么工作?
目录 简介:ChatGPT的工作原理概述 Transformer 架构原理...
2023/5/28 10:39:46 - 【ChatGPT】ChatGPT基础科普——知其一点所以然
目录 ChatGPT基础科普——知其一点所以然 语言的本质 从图灵测试到ChatGPT 1. LM 2. Transformer 3. GPT...
2023/5/28 10:09:26 - ChatGPT使用指南——相似匹配
目录 ChatGPT使用指南——相似匹配 1. 何为Embedding 2. 相关API 2.1 LMAS Embedding API 2.2 ChatGPT Style 3. Embedding应用...
2023/5/28 8:55:00 - 【ChatGPT】使用 LangChain 和 Ray 实现 100 行代码构建 LLM 开源搜索引擎【1】
目录 Introduction Building the index 构建索引 Accelerating indexing using Ray 使用 Ray 加速索引编制 Serving Conclusion...
2023/5/28 8:53:34 - 【ChatGPT】ChatGPT使用指南——文本生成
目录 ChatGPT使用指南——文本生成 1 引言 2 文本摘要任务 2.1 什么是文本摘要? 2.2 常见的文本摘要技术 2.3 基于OpenAI接口的文本摘要实验 3 文本纠错任务 3.1 什么是文本纠错? 3.2 常见的文本纠错技术 3.3 基于OpenAI接口的文本纠错实验 4…...
2023/5/28 8:24:05 - ChatGPT商业应用——LLM是星辰大海
目录 ChatGPT商业应用——LLM是星辰大海 1. 研究背景 1.1 研究背景 1.2 研究方法...
2023/5/28 7:59:04 - 国内可直接访问ChatGPT体验站,已稳定2个月 (域名被拦截解决方案)
新体验地址:https://zizhu888.cn/chatgpt/index.html ChatGPT体验站3月初上线,上线后,PV最高时3000,UV2000,付费用户有小300个 上线后,前前后后遇到了不少坑爹问题,下面是最近PV访问曲线图&am…...
2023/5/28 7:33:09 - AIGC——使用Cursor对比直接使用chatGPT有哪些技巧
Cursor对比直接使用chatGPT有哪些优势 1. 聊聊it团队经常面临的问题2. 试想一些AI辅助的应用场景3. 看回现实可用的工具及其使用3.1 加载文件作为对话上下文3.2 源码工程辅助阅读3.3 批量文件式输入口3.4 规范核查工具 4 通用思路4.1 提供解决方案思路4.2 借助chatGPT构建全流程…...
2023/5/28 4:27:19 - ChatGPT中文版Prompt提示工程超详细指南《提示工程高级技巧与技术》Github最新破万星项目Meta AI前工程师解密百万年薪提示工程师GPT-4模型优化利器(二)不定期更新
提示工程高级技巧与技术 前言Introduction 导言零样本提示少样本提示少样本提示的限制 Chain-of-Thought Prompting 链式思考(CoT)提示零样本COT提示 Zero-shot COT 自我一致性生成知识提示自动提示工程师(APE)Active-Prompt方向性…...
2023/5/28 0:42:10 - 【ChatGPT】ChatGPT使用指南——文本推理
目录 ChatGPT使用指南——文本推理 1. 什么是推理(Reasoning)? 2. 导入ChatGPT 3. 测试ChatGPT的推理能力...
2023/5/27 23:40:23 - ChatGPT免费使用的方法有哪些?
目录 一、ChatGpt是什么? 二、ChatGPT国内免费使用的方法: 第一点:电脑端 第二点:手机端 三、结语: 一、ChatGpt是什么? ChatGPt是美国OpenAI [1] 研发的聊天机器人程序 。更是人工智能技术驱动的自然语…...
2023/5/27 23:37:06 - 用ChatGPT辅助处理Excel
在日常工作中,我们经常需要处理大量的Excel表格,而在处理Excel表格时,常常会遇到重复、冗余、不清晰的数据等问题,导致我们耗费大量的时间和精力。 在这种情况下,现代技术的应用提供了更加高效的解决方案,…...
2023/5/27 18:32:31 - Pycharm安装ChatGPT插件
文章目录 前言一、安装ChatGPT插件二、使用步骤1.打开NexChatGPT2.发送请求 总结 前言 通过安装ChatGPT插件,您可以在PyCharm中更轻松、高效地使用ChatGPT模型进行开发,从而提高您的工作效率和准确性。 一、安装ChatGPT插件 打开PyCharm,单…...
2023/5/27 17:28:47 - 它来了!ios版ChatGPT
ChatGPT 的 iOS 版终于来了,不过目前只支持 iOS 美丽国区,你需要使用美丽国区账号才能下载使用。 目录 前提使用总结 前提 一部苹果手机一个美丽国苹果账号一个可以正常访问ChatGPT网页版的网络环境一个ChatGPT账号 使用 登录准备好的美丽国苹果账号。…...
2023/5/27 10:28:02 - 好用的IntelliJ IDEA ChatGPT插件:NexChatGPT
随着ChatGPT的爆火,ChatGPT给我们的生产生活带来一定的影响,ChatGPT相关的工具插件潮水般的涌现。ChatGPT对IT的影响也不小,尤其是自动化编程,今天介绍几款IntelliJ IDEA中ChatGPT插件。 一、NexChatGPT NexChatGPT是一款开箱即…...
2023/5/27 0:48:49 - 2023小狐狸ChatGPT源码1.9小程序 带绘画 带分销流量主系统智能客服AI源码+教程
2023全开源ChatGPT微信小程序,狐狸版本1.9,5.12已更新,增加绘画功能,带流量主带付费购买次数,可邀请好友获得问答次数 看广告获得问答次数 付费购买获得问答次数 狐狸版号1.9(最 新版)…...
2023/5/26 17:51:14 - 【国内chatgpt使用方法合集】(5月26日已更新)
写在前面 Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正࿰…...
2023/5/26 17:44:47 - 【ChatGPT】GPT-5 下一代:即将到来的7种能力将改变人工智能和技术的未来 | OpenAI
GPT-5 下一代:即将到来的7种能力将改变人工智能和技术的未来 | OpenAI 文章目录 GPT-5 下一代:即将到来的7种能力将改变人工智能和技术的未来 | OpenAI第一:扩展多模式理解。第二:交互式多媒体。第三:为具备一般能力的机器人提供动力。第四:自主人工智能模型开发。第五:…...
2023/5/26 11:55:09 - 玩转ChatGPT:论文辅助写作(附Claude测评)
一、写在前面 嘿!嘿!嘿!大家好,今天我们来聊一下使用GPT们进行论文辅助写作。不过,我要先交代一下,GPT的使用门槛比较高,不少童鞋都用不上。所以,我极力推荐一个平替产品——Claude…...
2023/5/26 11:26:08 - [持续更新]使用chatgpt的几种方法~
1. monica 使用edge浏览器或者chrome浏览器,直接在官网下载即可,网址直通: bing: https://www.microsoft.com/zh-cn/edge/download?formMA13FJ google: Google Chrome 网络浏览器 备注:你需要先搭上梯子哈 安装打…...
2023/5/26 10:39:41 - 苹果手机爽了!一招搞定ChatGPT Plus,超级稳!
大家好,我是五竹。 昨天用苹果手机尝试了一下,借助App Store(苹果应用商店)升级 Plus,成功了!一共升级了三个号!有两个一气呵成,轻松搞定。最后一个可能触发风控了,但第…...
2023/5/26 9:58:09 - ChatGPT账号注册,为什么总是提示Access Denied you do not have acces
问题:提示Access denied 无法登录登录的时候,提示Access denied,You do not have access to chat.openai.com.原因登录出现这个界面,说明你的IP被OpenAI拉黑了,OpenAI对比较频繁访问的云主机商屏蔽了相关的IP出口段,所…...
2023/5/26 9:00:56 - ChatGPT 的 AskYourPDF 插件所需链接如何获取?
一、背景 目前 ChatGPT 主要有两款 PDF 对话插件,一个是 AskYourPDF 一个是 ChatWithPDF(需 ChatGPT Plus),他们都可以实现给一个公共的PDF 链接,然后进行持续对话,对读论文,阅读 PDF 格式的文…...
2023/5/26 8:27:01