- 真颛
-
穷则软件优化,达的硬件堆积,本文主要介绍存储领域在硬件方向的一些探索。硬件方向的探索又分为大体两块,对现有硬件的性能压榨,以及新硬件设备的创新。对现有硬件的压榨主要是 SPDK RDMA,通过by pass驱动层来最大限度利用硬件的性能。新硬件的探索则包含了傲腾持久化内存和KV-SSD两块。其中持久化内存目前有些云厂商已经投入了使用,KV-SSD 则目前主要还是在学术理论阶段,业界未看到大规模的使用。
以下几篇论文分别介绍了在 SPDK KV-SSD方向的一些研究。
SpanDB: A Fast, Cost-Effective LSM-tree Based KV Store on Hybrid Storage 介绍了在SPDK的探索。
Towards Building a High-Performance, Scale-In Key-Value Storage System 是三星发布的介绍了他们最新的产品KV-SSD的论文,介绍了KVSSD 这种新型存储在kv的应用。
PinK: High-speed In-storage Key-value Store with Bounded Tails 则针对现在一些KVSSD实现的缺点做了优化,提出了一种针对KVSSD 优化的变种LSM 实现。
下文将非常对这三篇论文进行展开做详细的介绍。
本文主要介绍了如何基于 SPDK 构建LSM-tree Based KV Store。传统的kv实现需要通过调用文件系统层最后才会达到磁盘 ,对于 Nvme SSD 这种高性能设备,传统的io链路无法完全发挥硬件的性能,通过SPDK ByPass驱动层直接操作裸盘则可以将硬件性能发挥到极致。
使用SPDK对WAL进行并发写入,可以大大提升写入性能,支持异步请求处理,减少线程切换的开销。测试表明,对于小value写入,绕过ext4文件系统直接通过SPDK进行写入可以降低6.8-12.4倍的延时。由于WAL 处于关键路径上,这会对写入带来严重的性能开销导致性能瓶颈。其次,现在的kv架构都是假设磁盘设备速度较慢,因此设计上通常都嵌入了较高的软件开销,如果基于轮训的机制则会比较浪费cpu周期。本文基于rocksdb做了如下的优化:
多线程排队写入,有队列头部的线程直接获取当前的写入任务进行提交,可以做写入io合并,提升写入性能。如果写请求已经被提交,队列中部的请求发现已经完成写请求后直接返回,无需在进行io操作,通过group write,将大量的小io转化成顺序大io。
随着io设备性能的提升,linux io协议栈的开销变得不可忽视,通过SPDK将 驱动移动用户态,减少了系统调用并且支持zore copy,通过poll的方式而不是中断的方式进行io操作,减少了内核态的切换和io路径锁争用。同时这个章节对 Optane P4800x和P4610 两种设备进行了压测对比,简单列下压测结果。
图3的N 表示 P4610 0表示Optane 3-N 表示3个线程写入,CR=2 表示每个线程同时提交2个请求
可以看出使用多线程的SPDK 可以大大发挥磁盘性能
一旦进程绑定了SPDK,该磁盘就不能被其他进程访问,无论是通过io栈还是spdk。此外绑定cpu核心可以降低io的性能开销。加上polling-based io机制,导致后台的flush和compact线程不适合使用spdk进行读写,因为如果不绑核,会导致 io变慢,如果绑核了,则难以释放cpu空闲资源。
对于rocksdb和leveldb,前台的client写入通常都是同步的,用户同步提交读写请求然后等待io操作完成后返回,这种操作 通常会受限于io的延时导致吞吐的不足,为了提高吞吐,用户通常会设置超过cpu核心数的线程来进行并发的操作。但是对于使用了SPDK 的高速nvme,线程间的同步唤醒往往开销比io请求本身还大,超线程机制会带来额外的开销和降低了cpu的使用率。(好比redis 内存处理足够快,不需要多线程进行处理,多线程主要带来额外的开销争用)
对于一个n-core的机器,spandb配置Nc和线程数用于处理用户请求同时 进行了绑核,剩下的n-Nc个核心则用于处理内部的io请求,分为loggers和workers。loggers用于处理wal的写入 ,workers用于处理后台的flush和compaction以及memtable的读取和更新操作。
后台线程使用Qflush和Qcompact队列进行flush和compact操作,继承于rocksdb的实现,只是改为了直接操作SPDK
使用Qread队列来处理读请求,写请求则被拆分为Qprolog Qlog和Qepilog三个队列
基准压测表明,少数的几个核通过批量提交请求就可以充分利用磁盘的io,因此spandb默认使用了一个logger线程进行wal的写入,该线程数量可以动态在1-3之间调整,根据队列的长度和处理耗时动态调整线程数。对于前后台线程,优先保证前台线程的调度,同时会 监控后台队列的长度,以便在高负载写入的时候即使进行flush和compact。
为了减少对rocksdb本身的改动,抽象了一个TopFS 来管理spdk的相关操作。sst的数据布局与wal类似,也是通过metadata page管理,metadata page为hashtable,key为文件名,内容为文件对应的逻辑页起止id。
传统是kv存储实现,通常是存储引擎暴露kv接口,用户通过kv接口写入数据,key和value通过一定的数据结构被存储到文件里面,从用户调用接口到数据最终落到磁盘的整个流程可以用下图的左边部分来描述。
kv接口将数据写入文件系统,文件系统通过块设备驱动将数据写入磁盘,为了屏蔽磁盘的内部物理结构,文件系统到磁盘其实是通过LBA进行逻辑地址映射的,磁盘内部通过FTL将LBA转化为PBA,同时FTL还承担了磁盘的COW GC功能。可以看到从写入到落盘中间经历了非常多的环节。那么是否可以通过减少这些环节来进行写入流程的优化呢。比如上面提到的SPDK 通过bypaas文件系统少掉了一层文件系统的开销,那么是否还能更近一步呢。这篇论文正是基于这样想法,直接将kv的操作下层到设备层,由设备直接暴露了kv interface,直接bypass了设备层以及LBA到PBA的映射。通过设备内部的FTL ,直接实现了key到NAND location的映射。
设备暴露了put get delete iterate接口,kv请求通过pipeline的流程处理kv请求,固件驱动从磁盘io队列获取请求,然后传递给request handle,request handle再讲请求传递给index manager,index manager先将变长的key散列成定长的key缓存到local hashtable,最后在合并到全局的hashtable完成到磁盘位置offset的映射。同时index manager还会根据key的前4B进行分桶,通过将相同前缀的数据放在一起来实现迭代操作。local hashtable主要是为了提高写入并发减少全局hashtable的锁竞争。
垃圾回收时,垃圾回收器扫描flash中kv数据,然后和 全局hashtable做对比来判断数据的有效性,丢失已经被删除和更新的数据
性能测试部门主要测试了kvssd的cpu开销,在同样的ssd下,kvssd只需要一个线程就能达到与普通ssd8线程一样的io吞吐,同时,随着单机磁盘数量的提升,kvssd拥有更好的线性拓展能力。对于普通的ssd,单机的吞吐受限于cpu无法随着磁盘数量程线性增长,而kvssd由于极低的cpu开销可以提供更高的单机吞吐能力,对于昂贵的机柜资源,如果能在单机插更多的磁盘提供更高的吞吐显然是更经济的。
其实kvssd之所以需要更低的cpu开销,除了bypass了很多层,更重要的部分是他的固件模块其实已经有点类似于一个小型的cpu了,通过把cpu的工作offload到固件本身的做法在业界由来已久,比如将网络包的解析的bypass 内核offload到网卡直接进行。
虽然使用KV-SSD可以带来延迟的降低和吞吐的上升,但是这个降低只是针对平均值,目前现在大多数的KV-SSD的实现都存在一个长尾的问题。最常见的KV-SSD的实现包括hash-based KV-SSD 和LSM-tree Based KV-SSD,但是这两种实现都存在长尾的问题。
此外,控制器内部的DRAM和FLASH 的发展速度也不一样,平均每年DRAM增长1.13倍但是FLASH则增长了1.43倍,随着DRAM的增长,FLASH的需求将越来难以满足使用,因此设计一个减少FLASH使用的数据结果是势在必行的
总体架构的实现如下图,由于pink是LSM 的改进版本,此处会将pink的数据结构和rocksdb进行比较。pink的存储结构可以分为4部分,分别是 SkipList、 levelList 、meta segment 和data segment。
上面提到skiplist和levellist都存在FLASH 当中,那么FLASH 是否有足够的容量容纳这些levellist呢?对于一块4T 的磁盘,假设key value大小分别为32B和1KB,page的大小为16KB,那么对于一个16KB的meta segment,可以容纳的<k,v>pair数量为398个,对于4T的磁盘总共可以存储2^32个1KB大小的数据,也就是总共需要10.8M个meta segment,那么对于levelist来说需要占用的DRAM空间则为(32B+8B)* 10.8M = 432M 的内存空间。显然控制器的DRAM是够用的。
写入流程很简单,用户写入的数据会直接写入到skiplist中,熟悉LSM的人可能发现了,传统的LSM 写入为了保证数据的可靠性,都会先写入WAL 然后在写入内存memtable,但是此处并没有WAL而是直接写入skiplist会不会有问题呢。这个主要得益于磁盘控制器的自带的电容器,通过电容器可以保证断电数据不丢失,因此可以省掉一次的WAL写入
相比写入,读取流程则显得比较繁琐,以下图的查询key(39)为例。
从上面的读流程可以看到,对于极端的情况,一次的查询可能涉及非常多次的FLASH读取,比如上面的流程就需要读取metaPage0 metaPage2以及最终value所在的datapage12。对于level更多的场景需要读取FLASH 的次数将更多。
level Pinning的思路很简单,就是把meta segment尽可能的放在FLASH,这样就可以减少FLASH的读取了。那么问题来了,FLASH能放的下这么多的meta segment么。
同样直接对数据进行分析计算,由于LSM 的指数分层存储机制,每个Ln+1 层的数据都是Ln层的T倍,对于4T的磁盘,实际数据表明总共需要的存储层级为5级,对与L1到L4的层级分别需要的meta segment为0.91MB 50.86MB 2.83GB 161.3GB.由于一块4T的SSD 通常有4G的FLASH,那么显然是可以把L1到L3的meta segment放到FLASH里面的。
把metasegment放到了FLASH里面还带来了一个额外的好处,就是compaction的开销也随之降低的。因为L1到L3的meta 都在FLASH,可以大幅减少compact时meta更新带来的开销。
优化查找路径使用了级联的方法,简单说就是每一层的kv额外存储指向下一层的指针,其实就是类似skiplist的实现。通过级联的方法,当查询一个key的时候可以缩小每次二分查找的边界。查询Ln层的时候,先找到这个key的上下边界,如果Ln不满足,则根据上下边界直接定位到Ln+1 的上下边界,而无需对整个Ln+1进行二分查找。
级联需要额外的8字节指针开销,由于最后一层不需要存储级联指针,因此总共增加的级联指针开销为43.9M, FLASH 依然是够用的。
不过这里有一个问题论文里没说清楚,当Ln+1由于compaction更新以后,如何去更新Ln的级联指针,考虑到由于levellist都在FLASH中,这里去更新上层的级联指针的开销是可以接受的。
简单概括就是硬件加速,把计算逻辑offload到FPGA来实现硬件加速,达则堆积硬件。
gc优化包含meta segment的GC以及data segmetn的GC。
通过metapage的start从levelList中查询是否还有指针指向page,如果没有则直接回收,否则将数据迁移到空闲的page,然后修改levelList中的指针。由于上层的meta可以通过DRAM直接进行复制更新,因此开销是很低的
遍历需要回收的page逐条读取kv信息,根据key查询判断该数据是否还有效,如果失效了直接忽略,否则则需要对该value进行rewrite。对于rewrite,最简单的实现是参考wisckey,直接更新meta 中的value指针,如果meta segment是保存在DRAM中的那没有任何问题,但是如果meta page是在FLASH中的,由于越底层的数据都是旧数据,因此一个data segment的数据在meta 中往往很离散,这时更新meta的指针会带来meta segment的写放大,为了避免这个问题,pink对于存在FLASH的meta segment使用了延时更新,compact的时候直接把kv写入到L0进行覆盖,对于该kv由于读取是从上往下的,因此读取流程不会存在任何问题,metasegment的数据则可以等待meta指针失效的时候进行删除。
新硬件探索,硬件加速是今后存储发展的一个重要方向,同时随着新硬件的出现,现有的数据结构可能并不适合新硬件的的特性。从HDD 到SDD再到NVMe,硬盘性能不断升级,业界也针对SSD做了大量的存储优化。英特尔最新推出的PMEM则对存储又是一次大的革新,对于PMEM现在的文件系统其实已经不太合适了,因此也有针对该方面的优化 Rethinking File Mapping for Persistent Memory 。至于KVSSD,在该几篇论文后目前则又有了一些新的进展,NVMe 2.0 规范已经将KVSSD的指令集规范为NVMe-KV 指令集,因此KV-NVMe应该也不远了。
Reference:
https://github.com/OpenMPDK/KVSSD
Rethinking File Mapping for Persistent Memory
SpanDB: A Fast, Cost-Effective LSM-tree Based KV Store on Hybrid Storage
Towards Building a High-Performance, Scale-In Key-Value Storage System
PinK: High-speed In-storage Key-value Store with Bounded Tails
https://unix.stackexchange.com/questions/106861/what-is-the-relationship-of-inodes-lba-logical-volumes-blocks-and-sectors
相关推荐
java leveldb
java leveldb是什么,让我们一起了解一下? Leveldb是一个google实现的非常高效的kv数据库, Leveldb高效的kv数据,提供较高性能的本地存储(持久化)的功能,可为应用提供嵌入式的数据存储工作。 使用LevelDB它的特点和局限性是什么? 特点:LevelDB 是单进程的服务,性能非常之高,在一台4核Q6600的CPU机器上,每秒钟写数据超过40w,而随机读的性能每秒钟超过10w。 此处随机读是完全命中内存的速度,如果是不命中速度大大下降。 局限:LevelDB 只是一个 C/C++ 编程语言的库,不包含网络服务封装,所以无法像一般意义的存储服务器(如 MySQL)那样,用客户端来连接它。LevelDB 自己也声明,使用者应该封装自己的网络服务器。java调用Leveldb是怎么实现的? 因为原生leveldb是基于C++开发,java语言无法直接使用;iq80对leveldb使用JAVA 语言进行了“逐句”重开发,经过很多大型项目的验证(比如ActiveMQ),iq80开发的JAVA版leveldb在性能上损失极少(10%)。对于JAVA开发人员来说,我们直接使用即可,无需额外的安装其他lib。 java maven依赖,代码如下: org.iq80.leveldbleveldb0.7org.iq80.leveldbleveldb-api0.72023-07-03 16:09:571
leveldb怎么备份
LevelDB是一种高效的轻量级开源键值数据库,为了保证数据安全,经常需要进行备份。下面是备份 Leveldb 的基本步骤:1. 停止 LevelDB 服务,在备份过程中对数据库进行读写操作可能会导致数据不一致甚至损坏。2. 按照指定的路径把 LevelDB 数据目录复制或打包到备份目录中。您可以使用 cp 或 tar 命令来进行备份。如果使用 tar 命令备份数据目录,可以使用以下命令行:```tar czvf /path/to/backup.tar.gz /path/to/leveldb/data/dir```3. 如有需要,您可以对备份文件进行加密压缩保护。4. 可以将备份文件上传到远程存储设备或者拷贝到其他存储介质上。5. 完成备份后,可以重启 LevelDB 服务。备份是保障数据安全的有效手段,但是请注意,备份并不是万无一失的。因此为了更好地保护数据安全,您可以考虑设置定期备份、紧急备份以及数据同步等多个保障措施。2023-07-03 16:10:044
Leveldb源码有多少行
Leveldb源码有2w行。不论从nosql的存储设计,或是C++11的代码规范来看,都是很好的源码分析项目。为了更好地测试比较LevelDB的实际性能,Google的工程师也将LevelDB与另外两种数据库进行了对比。经过测试证明,LevelDB相较于另外两种数据库,无论是在基本操作环境下,还是在某些特定配置环境下,均具有非常优秀的读写性能。Leveldb源码优点key与value采用字符串形式,且长度没有限制。数据能持久化存储,同时也能将数据缓存到内存,实现快速读取。基于key按序存放数据,并且key的排序比较函数可以根据用户需求进行定制。支持简易的操作接口API,可以针对数据创建数据内存快照。支持前向、后向的迭代器。采用Google的Snappy压缩算法对数据进行压缩,以减少存储空间。2023-07-03 16:10:191
LevelDB 完全解析(3):SSTable
前文回顾 SSTable 全称 Sorted String Table,顾名思义,里面的 key-value 都是有序保存的。除了两个 MemTable,LevelDB 中的大部分数据是以 SSTable 的形式保存在外存上。 SSTable 由 compaction 生成: 在一个 SSTable 中,文件末尾的 Footer 是定长的,其他数据都被划分成一个个变长的 block:index block、metaindex block、meta blocks、data blocks。 Index block 、 meta index block 、 data block 都是通过 BlockBuilder 来生成,通过 Block 来读取的。最简单的方式,block 里面只需要将一个个 key-value 有序保存。但是为了节省空间,LevelDB 在 block 的内部实现了 前缀压缩 。 前缀压缩利用了 key 的有序性(前缀相同的有序 key 会聚集在一起)对 key 进行压缩,每个 key 与前一个 key 相同的前缀部分可以不用保存。读取的时候再根据规则进行解码即可。 LevelDB 将 block 的一个 key-value 称为一条 entry。每条 entry 的格式如下: 一个 block 的数据格式如下: 在 block 中查找一个 key( Block::Iter::Seek ): Meta block(bloom filter)由 FilterBlockBuilder 来生成,通过 FilterBlockReader 来读取。 后面会单独写一篇介绍 filter。2023-07-03 16:10:311
Leveldb解析之四:Compaction
这一篇我们来解析leveldb的Compaction机制,要把这个讲清楚,需要回答下面的问题: 随着Put/Delete操作增多,sstable文件会越来越多,占用的磁盘空间也越来越大。删除无效的key( 被标记删除的key,被新版本覆盖的老版本的key ),然后重新生成sstable文件,可以有效减少sstable文件的数量,这个过程就是Compaction。 Compaction的入口函数是MaybeScheduleCompaction(),触发的时机: leveldb是在后台线程执行Compact,目前只允许单线程,也就是说Compact只能串行执行。 入口函数是DBImpl::BackgroundCompaction(),流程如下: leveldb通过VersionSet::PickCompaction()来选择要压缩的Layer和Table,怎么做到的呢? 原来,在每个Version生成的时候,会计算哪个Layer需要进行Compaction,方法是计算每个layer的compaction_score,选择得分最高的layer,这是由LogAndApply()函数完成的: 调用LogAndApply()生成Version的时机: 选择Layer和Table的过程头绪比较多,具体实施Compaction的过程相对比较好理解,用下面这张图表述Compaction的整个过程:2023-07-03 16:10:381
LevelDB存储量对性能有多大影响?
可能很多人都不知道RedisStorage 和redis 之间的区别。 redis的存储是存储在内存里的, RedisStorage可以选择存储在磁盘里. 当redis崩溃的时候。redis 会从rdb或者aof文件重新读取数据到内存里。如果数据量很大的话。这个初始化是相当的慢。(这就是 redis的假数据持久)。 RedisStorage 是直接存储在 磁盘里。所以不存在这个数据重加载问题。还有redis 存储是受物理内存限制的,比如你有几千万或者几亿的数据。如果存储在redis里。那得需要多巨大的内存了。使用RedisStorage 就没有物理内存限制这个问题。最大可以存储十亿数据。最后说一下淘宝的Tair ldb项目。同样基于leveldb 存储引擎。 广泛的用在 登录淘宝、查看商品详情页面、在淘江湖和好友“捣浆糊”等。 说明leveldb 数据引擎的可靠性和海量数据存储。 但是开源版的Tair ldb 并不好用。所以自己写了个基于 leveldb的 server端。2023-07-03 16:10:441
python leveldb 统计有多少数据
import sys import leveldb def read_data(): if len(sys.argv) < 2: print "pls input leveldb dir" return -1 db = leveldb.LevelDB(sys.argv[1]) for k in db.RangeIter(include_value = False): print db.Get(k) if __name__ == "__main__": read_data() print "read end"2023-07-03 16:10:541
python 怎么安装leveldb
安装Python包,的确是pip最为方便了,简单快捷,因为它直接是从pypi上面下载文件,保证文件的安全性和可靠性,并且资源丰富;下面是安装步骤:下载 setuptools,注意对应 Python 的版本,完成后运行 exe 即可完成安装setuptools-1.4.1.win32-py2.6.exe下载 pippip-1.4.1.tar.gz安装 pip3.1 解压pip-1.4.1.tar.gz3.2 运行CMD,进入命令行3.3 用CD命令进入 pip 解压目录3.4 输入 "python setup.py install"3.5 添加环境变量 path = C:Python26ArcGIS10.0Scripts验证是否安装成功,运行CMD,进入命令行,输入pip;如果出现pip的用法介绍,说明安装成功。进入命令行,输入 "pip install package",package为安装包名称,就可以随意使用了;如果pip安装不成功的话,建议去PYPI上下载文件,然后自行安装。2023-07-03 16:11:032
吸血鬼幸存者金币修改方法分享
吸血鬼幸存者金币是游戏中的重要资源道具,如何修改金币数量?下面给大家分享一个吸血鬼幸存者金币修改方法【警告:修改会严重降低游戏可玩寿命】我用Cheat Engine修改内存失败了。现在找到了修改存档的办法。首先是存档位置:C:/Users/XXXXX/AppData/Roaming/Vampire_Survivors/Local Storage/leveldbXXXXX就是你的用户名存档是用leveldb储存的,无法直接用文本编辑器修改,需要使用leveldb编辑器我用的SuperMarcus做的编辑器百度网盘下载:1J7qS7hUB8yESh7K7mQp0-w?pwd=umc3 提取码: umc31. 首先要确保电脑上装有 Java ,确保游戏没有运行,先备份存档文件夹。2. 然后打开下载的LevelDBViewer.jar3. 点击Open,选择你的存档位置,点击Continue。4. 左侧会出现很多“_file://...", 其中第6个是”_file://CapacitorStorage.Coins", 选中它5. 右侧有一个Value,其下面的String就是金钱数量。例如我是“587.6”6. 修改这个值。例如“587999.6”。然后点击右上角的Save。7. 进入游戏,应该已经成功了。2023-07-03 16:11:101
爬虫的数据库选型,redis,leveldb,mongodb,mysql 选哪个
爬虫的数据库选型,redis,leveldb,mongodb,mysql 选哪个爬虫推荐mongodb: 好处如下: 数据结构利于保存和提取 适合提供便利的restapi 数据量过大可以分库存储2023-07-03 16:11:301
请问数据库有哪些种类呢?
数据库可以从是否是关系型维度来区分,也可以从面向操作或面向数据分析方面来区分。Operational-Relational Database:典型应用场景: ERP, CRM, 信用卡交易处理, 小型电子商务数据存储方式: 表格主流厂商: Oracle Database, Microsoft SQL Server, IBM DB2, SAP Hana, Amazon Aurora, Azure SQL Database, Enterprise DB (PostgreSQL), MySQL, MemSQL优势:成熟的生态环境,事务保证/数据一致性劣势:严格的数据模型定义,数据库扩展限制,与非结构化的融合使用较难。Analytical-Relational Database:典型应用场景: 数据仓库,商务智能,数据科学数据存储方式: 表格主流厂商: Oracle Exadata, Oracle Hyperion, Teradata, IBM Netezza, IBM dashDB, Amazon Redshift, Microsoft SQL Data Warehouse, Google BigQuery优势: 信息和计算的一致性劣势: 需要针对数据库专业的IT人员维护,数据响应数据通常在分钟级Operational-Nonrelational Database:典型应用场景: Web, mobile, and IoT applications, social networking, user recommendations, shopping carts数据存储方式: 有很多存储结构 (document, graph, column, key-value, time series)主流厂商: MongoDB, Amazon DynamoDB, Amazon,DocumentDB, Azure CosmosDB, DataStax, Neo4j, Couchbase, MarkLogic, Redis优势: 易用性,灵活性(不需要预定义的模式),水平伸缩(以适应大量数据量),一般低成本(开源)劣势: 缺乏事务保证Analytical -Nonrelational Database:典型应用场景: 索引数以百万计的数据点,预测性分析,欺诈检测数据存储方式: Hadoop不需要固有的数据结构; 数据可以跨多个服务器存储主流厂商: Cloudera, Hortonworks, MapR, MarkLogic, Snowflake, DataBricks, ElasticSearch优势: 适合批量处理, 并行处理文件; 主要是开源的,投入较低劣势: 缓慢的响应时间; 不适合快速查找或快速更新2023-07-03 16:11:386
数据库有哪几种
数据库有两种类型,分别是关系型数据库与非关系型数据库。1、关系数据库包括:MySQL、MariaDB(MySQL的代替品,英文维基百科从MySQL转向MariaDB)、Percona Server(MySQL的代替品)、PostgreSQL、Microsoft Access、Microsoft SQL Server、Google Fusion Tables。FileMaker、Oracle数据库、Sybase、dBASE、Clipper、FoxPro、foshub。几乎所有的数据库管理系统都配备了一个开放式数据库连接(ODBC)驱动程序,令各个数据库之间得以互相集成。2、非关系型数据库(NoSQL)包括:BigTable(Google)、Cassandra、MongoDB、CouchDB、键值(key-value)数据库、Apache Cassandra(为Facebook所使用):高度可扩展、Dynamo、LevelDB(Google)。扩展资料:数据库的作用数据库管理系统是为管理数据库而设计的电脑软件系统,一般具有存储、截取、安全保障、备份等基础功能。数据库管理系统可以依据它所支持的数据库模型来作分类,例如关系式、XML;或依据所支持的计算机类型来作分类,例如服务器群集、移动电话。或依据所用查询语言来作分类,例如SQL、XQuery;或依据性能冲量重点来作分类,例如最大规模、最高运行速度;亦或其他的分类方式。不论使用哪种分类方式,一些DBMS能够跨类别,例如,同时支持多种查询语言。参考资料来源:百度百科--数据库2023-07-03 16:12:031
常用嵌入式数据库有哪些(嵌入式数据库是什么区块)
嵌入式数据库还是有很多的,这里举几个吧:1.BerkeleyDB常用嵌入式数据库有哪些BerkeleyDB(BDB)是一个高效的嵌入式数据库编程库,C语言、C、Java、Perl、Python、Tcl以及其他很多语言都有其对应的API。BerkeleyDB可以保存任意类型的键/值对(Key/ValuePair),而且可以为一个键保存多个数据。BerkeleyDB支持让数千的并发线程同时操作数据库,支持最大256TB的数据,广泛用于各种操作系统,其中包括大多数类Unix操作系统、Windows操作系统以及实时操作系统。2.CouchbaseLiteCouchbaseLite是一个为满足在线和离线的移动应用所开发的超轻量的,可靠的,并且安全的JSON数据库。即使在最不确定的网络条件下,亦可以给您的移动应用提供富有成效的和可靠的信誉。除此之外,"同步门户"功能亦可以提供协作,社交互动或者是用户的更新。3.LevelDBLevelDB是Google开源出的一个Key/Value存储引擎,它采用C编写的,支持高并发访问和写入,特别适合对于高写入业务环境。4.SQLiteSQLite是一个开源的嵌入式关系数据库,实现自包容、零配置、支持事务的SQL数据库引擎。其特点是高度便携、使用方便、结构紧凑、高效、可靠。与其他数据库管理系统不同,SQLite的安装和运行非常简单,在大多数情况下-只要确保SQLite的二进制文件存在即可开始创建、连接和使用数据库。5.UnQLiteUnQLite是,由SymiscSystems公司出品的一个嵌入式C语言软件库,它实现了一个自包含、无服务器、零配置、事务化的NoSQL数据库引擎。UnQLite是一个文档存储数据库,类似于MongoDB、Redis、CouchDB等。同时,也是一个标准的Key/Value存储,与BerkeleyDB和LevelDB等类似。2023-07-03 16:12:291
数据库都有哪些?
数据库共有3种类型,分别为:关系数据库、非关系型数据库和键值数据库。2023-07-03 16:12:393
全球四个最大的四个开源库
开源数据库MySQL MySQL是一个开放源码的小型关联式数据库管理系统,开发者为瑞典MySQL AB公司。目前MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源... 开源数据库MySQL MySQL是一个开放源码的小型关联式数据库管理系统,开发者为瑞典MySQL AB公司。目前MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。 盘点:开源社区那些免费的数据库软件 MySQL为多种编程语言提供了API,包括C、C++、C#、Delphi、Eiffel、Java、Perl、PHP、Python、Ruby和Tcl等。而其自身是采用C和C++编写的,使用了多种编译器进行测试,所以,MySQL能够保证源代码具有很强的可移植性。这样的一款数据库,自然能够支持几乎所有的操作系统,从Unix、Linux到Windows,具体包括AIX、BSDi、FreeBSD、HP-UX、Linux、Mac OS、Novell Netware、NetBSD、OpenBSD、OS/2 Wrap、Solaris、SunOS、Windows等多种操作系统。最重要的是,它是一个可以处理拥有上千万条记录的大型数据库。 与此同时,MySQL也产生了很多分支版本的数据库也非常值得推荐。 首先是MariaDB,它是一个采用Maria存储引擎的MySQL分支版本,是由原来MySQL的作者 Michael Widenius创办的公司所开发的免费开源的数据库服务器。与MySQL相比较,MariaDB更强的地方在于它拥有更多的引擎,包括Maria存储引擎、PBXT存储引擎、XtraDB存储引擎、FederatedX存储引擎,它能够更快的复制查询处理、运行的速度更快、更好的功能测试以及支持对Unicode的排序等。 其次是rcona,它为MySQL数据库服务器进行了改进,在功能和性能上较MySQL有着很显著的提升。该版本提升了在高负载情况下的InnoDB的性能,同时,它还为DBA提供一些非常有用的性能诊断工具,并且提供很多参数和命令来控制服务器行为。 第三是Percona Server,它使用了诸如google-mysql-tools、Proven Scaling和 Open Query对MySQL进行改造。并且,它只包含MySQL的服务器版,并没有提供相应对 MySQL的Connector和GUI工具进行改进。 非关系型数据库NoSQL 从NoSQL的字面上理解,NoSQL就是Not Only SQL,被业界认为是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于目前铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。 盘点:开源社区那些免费的数据库软件 当然,NoSQL也是随着互联网Web2.0网站的兴起才能取得长足的进步。关键的需求在于,传统的关系数据库在应付Web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。 首先推荐的是Oracle NoSQL Database,这是一个社区版。Oracle的这个NoSQL Database, 是在10月4号的甲骨文全球大全上发布的Big Data Appliance的其中一个组件,Big Data Appliance是一个集成了Hadoop、NoSQL Database、Oracle数据库Hadoop适配器、Oracle数据库Hadoop装载器及R语言的系统。 其次推荐的是Membase。Membase是NoSQL家族的一个新的重量级的成员。Membase是开源项目,源代码采用了Apache2.0的使用许可。该项目托管在GitHub.Source tarballs上,目前可以下载beta版本的Linux二进制包。该产品主要是由North Scale的memcached核心团队成员开发完成,其中还包括Zynga和NHN这两个主要贡献者的工程师,这两个组织都是很大的在线游戏和社区网络空间的供应商。 并且,Membase容易安装、操作,可以从单节点方便的扩展到集群,而且为memcached(有线协议的兼容性)实现了即插即用功能,在应用方面为开 发者和经营者提供了一个比较低的门槛。做为缓存解决方案,Memcached已经在不同类型的领域(特别是大容量的Web应用)有了广泛的使用,其中 Memcached的部分基础代码被直接应用到了Membase服务器的前端。通过兼容多种编程语言和框架,Membase具备了很好的复用性。在安装和配置方面,Membase提供了有效的图形化界面和编程接口,包括可配置 的告警信息。 Membase的目标是提供对外的线性扩展能力,包括为了增加集群容量,可以针对统一的节点进行复制。 另外,对存储的数据进行再分配仍然是必要的。 第三推荐的是Hibari。Hibari在日语中意思为“云雀”,它是一个专为高可靠性和大数据存储的数据库引擎,可用于云计算环境中,例如 webmail、SNS和其他要求T/P级数据存储的环境中。同时,Hibari也支持Java,C/C++,Python,Ruby和Erlang语言的客户端。 第四推荐的是memcachedb。这是一个由新浪网的开发人员开放出来的开源项目,给memcached分布式缓存服务器添加了Berkeley DB的持久化存储机制和异步主辅复制机制,让memcached具备了事务恢复能力、持久化能力和分布式复制能力,非常适合于需要超高性能读写速度,但是 不需要严格事务约束,能够被持久化保存的应用场景,例如memcachedb被应用在新浪博客上面。 第五推荐的是Leveldb。这是一个Google实现的非常高效的kv数据库,目前的版本1.2能够支持billion级别的数据量了。 在这个数量级别下还有着非常高的性能,主要归功于它的良好的设计,特别是LSM算法。LevelDB是单进程的服务,性能非常之高,在一台4个Q6600的CPU机器上,每秒钟写数据超过40w,而随机读的性能每秒钟超过10w。 XML数据库的优势 XML数据库是一种支持对XML格式文档进行存储和查询等操作的数据管理系统。在系统中,开发人员可以对数据库中的XML文档进行查询、导出和指定格式的序列化。目前XML数据库有三种类型:XMLEnabledDatabase(XEDB),即能处理XML的数据库;NativeXMLDatabase(NXD),即纯XML数据库;HybridXMLDatabase(HXD),即混合XML数据库。 关系数据库中的第一代XML支持是切分(或分解)文档,以适应关系表格或将文档原封不动地存储为字符或二进制大对象(CLOB 或 BLOB)。这两个方法中的任一种都尝试将XML模型强制转换成关系模型。然而,这两种方法在功能和性能上都有很大的局限性。混合型模型将XML存储在类似于DOM的模型中。XML数据被格式化为缓冲数据页,以便快速导航和执行查询以及简化索引编制。 在这里,首要要推荐的XML数据库是Sedna。它号称是一款原生态的XML数据库,提供了全功能的核心数据库服务,包括持久化存储、ACID事务、索引、安全、热备、UTF8等。实现了 W3C XQuery 规范,支持全文搜索以及节点级别的更新操作。 第二款XML数据库是BaseX。这款数据库用来存储紧缩的XML数据,提供了高效的 XPath和XQuery的实现,同时,它还提供一个前端操作界面。 盘点:开源社区那些免费的数据库软件 第三款推荐的是XMLDB。这款数据库使用了关系型数据库来存储任意的XML文档,因为所采用的存储机制,所以文档的搜索速度特别快,同时执行XSL转换也相当快。XMLDB同时还提供了一个PHP的模块,可以应用在Web应用中。 第四块推荐的是X-Hive/DB。它是一个为需要高级XML数据处理和存储功能的软件开发者设计的强大的专属XML数据库。X-Hive/DB Java API包含存储、查询、检索、转换和发表XML数据的方法。 与传统关系型数据库相比,XML数据库具有以下优势:第一,XML数据库能够对半结构化数据进行有效的存取和管理。如网页内容就是一种半结构化数据,而传统的关系数据库对于类似网页内容这类半结构化数据无法进行有效的管理。第二,提供对标签和路径的操作。传统数据库语言允许对数据元素的值进行操作,不能对元素名称操作,半结构化数据库提供了对标签名称的操作,还包括了对路径的操作。第三,当数据本身具有层次特征时,由于XML数据格式能够清晰表达数据的层次特征,因此XML数据库便于对层次化的数据进行操作。XML数据库适合管理复杂数据结构的数据集,如果己经以XML格式存储信息,则XML数据库利于文档存储和检索;可以用方便实用的方式检索文档,并能够提供高质量的全文搜索引擎。另外XML数据库能够存储和查询异种的文档结构,提供对异种信息存取的支持。2023-07-03 16:12:482
caffe win7+matlab刚安装调试的时候出现warning LNK4099: 未找到 PDB“vc120.pdb”怎么解决。谢谢
任务栏上点右键——属性——‘开始"菜单 把隐私下面的两条勾掉,再点“自定义”, 然后把最下面“最近使用的项目”勾掉。这个文件是编译的时候生成的啊,你只要是选择菜单栏bulid->rebuild all(或rebuild resolution),就好了。重新编译后就会生成新的。如果是不提示,直接是#pragma warning( disable: 4099)。2023-07-03 16:12:581
RocksDB系列十:Benchmarking tools
u2002u2002db_bench是测试RocksDB性能的主要工具。RocksDB从LevelDB继承了db_bench,并扩展了其功能以支持更多的功能。db_bench支持产生多种类型的workload以便对RocksDB更多的benchmark,而且有很多的选项以支持配置测试环境。 u2002u2002快速上手 如果需要添加一些统计,使用--statistic 也可以顺序执行多个benchmark Benchmark list db_bench option2023-07-03 16:13:041
win7配置caffe,import caffe时提示No module named caffe
这种情况一般是没有把caffe中的和python相关的内容的路径添加到python的编译路径中。可以使用以下方式解决问题:在Ubuntu中,按住ctrl+alt+t打开终端,输入“python”打开python解释器,输入:import syssys.path.append("/(你的caffe-master路径)/caffe-master/python")sys.path.append("/(你的caffe-master路径)/caffe-master/python/caffe")提示:输入每一行之后都要按回车,让命令执行。三条命令执行之后一般就没问题了。因为python的编译路径“path”是模型“sys”的一个属性,所以要先使用命令“import sys”。好吧,我承认上述方法治标不治本。在python解释器输入以上命令之后,使用import caffe木有问题,但是重启python解释器之后再import caffe还是会报同样的错误。只有在caffe-master/python这个文件夹之下打开python解释器使用import caffe才不会报错。随后找到了一个不是解决办法的办法,使用python调用caffe时,在相应的.py文件的最前面加入以下四句:#设置caffe源码所在的路径 caffe_root = "../../../caffe-master/(这是caffe-master文件夹路径,绝对路径和相对路径都可以。绝对路径写法:/../../caffe-master/)" import sys sys.path.insert(0, caffe_root + "python") import caffe 这样就没有问题了。当然,所有调用caffe框架的.py文件中都要包含这几句话。也可以把以上几句封装成一个python类,专门用来实现“import caffe”的操作。2023-07-03 16:13:371
数据库有哪些种类?分别是干什么用的?
数据库共有3种类型,为关系数据库、非关系型数据库和键值数据库。1、关系数据库MySQL、MariaDB(MySQL的代替品,英文维基百科从MySQL转向MariaDB)、Percona Server(MySQL的代替品·)、PostgreSQL、Microsoft Access、Microsoft SQL Server、Google Fusion Tables、FileMaker、Oracle数据库、Sybase、dBASE、Clipper、FoxPro、foshub。几乎所有的数据库管理系统都配备了一个开放式数据库连接(ODBC)驱动程序,令各个数据库之间得以互相集成。2、非关系型数据库(NoSQL)BigTable(Google)、Cassandra、MongoDB、CouchDB。3、键值(key-value)数据库Apache Cassandra(为Facebook所使用):高度可扩展、Dynamo、LevelDB(Google)。扩展资料:数据库模型:对象模型、层次模型(轻量级数据访问协议)、网状模型(大型数据储存)、关系模型、面向对象模型、半结构化模型、平面模型(表格模型,一般在形式上是一个二维数组。如表格模型数据Excel)。数据库的架构可以大致区分为三个概括层次:内层、概念层和外层。参考资料来源:百度百科—数据库2023-07-03 16:14:132
消息队列核心原理
消息队列已经逐渐成为分布式应用场景、内部通信、以及秒杀等高并发业务场景的核心手段,它具有低耦合、可靠投递、广播、流量控制、最终一致性 等一系列功能。 无论是 RabbitMQ、RocketMQ、ActiveMQ、Kafka还是其它等,都有的一些基本原理、术语、机制等,总结分享出来,希望大家在使用消息队列技术的时候能够快速理解。 1.消息生产者Producer:发送消息到消息队列。 2.消息消费者Consumer:从消息队列接收消息。 3.Broker:概念来自与Apache ActiveMQ,指MQ的服务端,帮你把消息从发送端传送到接收端。 4.消息队列Queue:一个先进先出的消息存储区域。消息按照顺序发送接收,一旦消息被消费处理,该消息将从队列中删除。 1)消息的转储:在更合适的时间点投递,或者通过一系列手段辅助消息最终能送达消费机。 2)规范一种范式和通用的模式,以满足解耦、最终一致性、错峰等需求。 3)其实简单理解就是一个消息转发器,把一次RPC做成两次RPC。发送者把消息投递到broker,broker再将消息转发一手到接收端。 总结起来就是两次RPC加一次转储,如果要做消费确认,则是三次RPC。 点对点模型 用于 消息生产者 和 消息消费者 之间 点到点 的通信。 点对点模式包含三个角色: 发布订阅模型包含三个角色: 生产者发送一条消息到队列queue,只有一个消费者能收到。 发布者发送到topic的消息,只有订阅了topic的订阅者才会收到消息。 基于Queue消息模型,利用FIFO先进先出的特性,可以保证消息的顺序性。 即消息的Ackownledge确认机制,为了保证消息不丢失,消息队列提供了消息Acknowledge机制,即ACK机制,当Consumer确认消息已经被消费处理,发送一个ACK给消息队列,此时消息队列便可以删除这个消息了。如果Consumer宕机/关闭,没有发送ACK,消息队列将认为这个消息没有被处理,会将这个消息重新发送给其他的Consumer重新消费处理。 主要是用“记录”和“补偿”的方式。 1.本地事务维护业务变化和通知消息,一起落地,然后RPC到达broker,在broker成功落地后,RPC返回成功,本地消息可以删除。否则本地消息一直靠定时任务轮询不断重发,这样就保证了消息可靠落地broker。 2.broker往consumer发送消息的过程类似,一直发送消息,直到consumer发送消费成功确认。 3.我们先不理会重复消息的问题,通过两次消息落地加补偿,下游是一定可以收到消息的。然后依赖状态机版本号等方式做判重,更新自己的业务,就实现了最终一致性。 4.如果出现消费方处理过慢消费不过来,要允许消费方主动ack error,并可以与broker约定下次投递的时间。 5.对于broker投递到consumer的消息,由于不确定丢失是在业务处理过程中还是消息发送丢失的情况下,有必要记录下投递的IP地址。决定重发之前询问这个IP,消息处理成功了吗?如果询问无果,再重发。 6.事务:本地事务,本地落地,补偿发送。本地事务做的,是业务落地和消息落地的事务,而不是业务落地和RPC成功的事务。消息只要成功落地,很大程度上就没有丢失的风险。 消息的收发处理支持事务,例如:在任务中心场景中,一次处理可能涉及多个消息的接收、处理,这应该处于同一个事务范围内,如果一个消息处理失败,事务回滚,消息重新回到队列中。 消息的持久化,对于一些关键的核心业务来说是非常重要的,启用消息持久化后,消息队列宕机重启后,消息可以从持久化存储恢复,消息不丢失,可以继续消费处理。 在实际生产环境中,使用单个实例的消息队列服务,如果遇到宕机、重启等系统问题,消息队列就无法提供服务了,因此很多场景下,我们希望消息队列有高可用性支持,例如RabbitMQ的镜像集群模式的高可用性方案,ActiveMQ也有基于LevelDB+ZooKeeper的高可用性方案,以及Kafka的Replication机制等。2023-07-03 16:14:281
Caffe训练自己的imagenet,ubuntu提示killed
1、准备数据。假设已经下载好数据集和验证集,存储路径为:/path/to/imagenet/train/n01440764/n01440764_10026.JPEG/path/to/imagenet/val/ILSVRC2012_val_00000001.JPEG首选需要创建一个txt文件,列举出所有图像以及对应的lable,caffe包“Python/caffe/imagenet/ilsvrc_2012_train.txt”和“ilsvrc_2012_val.txt”两个文件分别是标好的训练集和验证集的文件,共分为1000类。还需要注意的是,所有的图像都需要归一到同样的尺寸。2、转化生成训练集。运行下面的命令:GLOG_logtostderr=1 examples/convert_imageset.bin /path/to/imagenet/train/ python/caffe/imagenet/ilsvrc_2012_train.txt /path/to/imagenet-train-leveldb生成文件存储在“/path/to/imagenet-train_leveldb”路径下。3、计算图像均值。执行命令:examples/demo_compute_image_mean.bin /path/to/imagenet-train-leveldb /path/to/mean.binaryproto第一个参数是执行脚本代码,第二个参数是上一步生成的数据集,第三个参数是存储图像均值的目录路径。4、定义网络。ImageNet的网络定义在“examples/imagenet.prototxt”文件中,使用时需要修改里面source和meanfile变量的值,指向自己文件的路径。仔细观察imagenet.prototxt和imagenet_val.prototxt文件可以发现,训练和验证的参数大部分都相同,不同之处在于初始层和最后一层。训练时,使用softmax_loss层来计算损失函数和初始化后向传播,验证时,使用accuracy层来预测精确度。在文件“examples/imagenet_solver.prototxt”中定义solver协议,同样需要修改train_net和test_net的路径。5、训练网络。执行命令:GLOG_logtostderr=1 examples/train_net.bin examples/imagenet_solver.prototxt6、在python中使用已经训练好的模型。Caffe只提供封装好的imagenet模型,给定一副图像,直接计算出图像的特征和进行预测。首先需要下载模型文件。Python代码如下:[python] view plain copy print?from caffe import imagenet from matplotlib import pyplot # Set the right path to your model file, pretrained model # and the image you would like to classify. MODEL_FILE = "examples/imagenet_deploy.prototxt" PRETRAINED = "/home/jiayq/Downloads/caffe_reference_imagenet_model" IMAGE_FILE = "/home/jiayq/lena.png" net = imagenet.ImageNetClassifier(MODEL_FILE, PRETRAINED) #预测 prediction = net.predict(IMAGE_FILE) #绘制预测图像 print "prediction shape:", prediction.shape pyplot.plot(prediction) prediction shape: (1000,) [<matplotlib.lines.Line2D at 0x8faf4d0>] #结果如图所示 图上的横轴表示的label,纵轴表示在该类别上的概率,有图我们看到,lena.jpg被分到了”sombrero”这组,结果还算准确。2023-07-03 16:14:351
浅析 Fabric Peer 节点
Hyperledger Fabric,也称之为超级账本,是由 IBM 发起,后成为 Linux 基金会 Hyperledger 中的区块链项目之一。 Fabric 是一个提供分布式账本解决方案的平台,底层的账本数据存储使用了区块链。区块链平台通常可以分为公有链、联盟链和私有链。公有链典型的代表是比特币这些公开的区块链网络,谁都可以加入到这个网络中。联盟链则有准入机制,无法随意加入到网络中,联盟链的典型例子就是 Fabric。 Fabric 不需要发币来激励参与方,也不需要挖矿来防止有人作恶,所以 Fabric 有着更好的性能。在Fabric 网络中,也有着诸多不同类型的节点来组成网络。其中 Peer 节点承载着账本和智能合约,是整个区块链网络的基础。在这篇文章中,会详细分析 Peer 的结构及其运行方式。 在本文中,假设读者已经了解区块链、智能合约等概念。 本文基于 Fabric1.4 LTS。 区块链网络是一个分布式的网络,Fabric 也是如此,由于 Fabric 是联盟链,需要准入机制,所以在网络结构上会复杂很多,下面是一个简化的 Fabric 网络: 各个元素的含义如下: 对于 Fabric 网络,外部的用户需要通过客户端应用,也就是图中的 A1、A2 或者 A3 来访问网络,客户端应用需要通过 CA 证书表明自己的身份,这样才能访问到 Fabric 网络中有权限访问的部分。 在上面的网络中,共有四个组织,R1、R2、R3 和 R4。其中 R4 是整个 Fabric 网络的创建者,网络是根据 NC4 配置的。 在 Fabric 网络中,不同的组织可以组成联盟,不同的联盟之间数据通过 Channel 来隔离。Channel 中的数据只有该联盟中的组织才能访问,每一个新的 Channel 都可以认为是一条新的链。与其他的区块链网络中通常只有一条链不一样,Fabric 可以通过 Channel 在网络中快速的搭建出一个新的区块链。 上面 R1 和 R2 组成了一个联盟,在 C1 上交易。R2 同时又和 R3 组成了另外一个联盟,在 C2 上交易。R1 和 R2 在 C1 上交易时,对 R3 是不可见的,R2 和 R3 在 C2 上交易时,对 R1 是不可见的。Channel 机制提供了很好的隐私保护能力。 Orderer 节点是整个 Fabric 网络共有的,用来为所有的交易排序、打包。比如上面网络中 O4 节点。本文不会对 Orderer 节点进行详细说明,可以把这个功能理解为比特币网络中的挖矿过程。 Peer 节点表示网络中的节点,通常一个 Peer 就表示一个组织,Peer 是整个区块链网络的基础,是智能合约和账本的载体,Peer 也是本文讨论的重点。 一个 Peer 节点可以承载多套账本和智能合约,比如 P2 节点,既维护了 C1 的账本和智能合约,也维护了 C2 的账本和智能合约。 为了可以更深入了解 Peer 节点的作用,先了解一下 Fabric 整体的交易流程。整体的交易流程图如下: Peer 节点按照功能来分可以分为 背书节点 和 记账节点 。 客户端会提交交易请求到背书节点,背书节点开始模拟执行交易,在模拟执行之后,背书节点并不会去更新账本数据,而是把这个交易进行加密和签名,然后返回给客户端。 客户端收到这个响应之后就会把响应提交到 Orderer 节点,Orderer 节点会对这些交易进行排序,并打包成区块,然后分发到记账节点,记账节点就会对交易进行验证,验证结束之后,就会把交易记录到账本里面。 一笔交易是否能成功是根据背书策略来指定的,每一个智能合约都会指定一个背书策略。 Peer 节点代表着联盟链中的各个组织,区块链网络也是由 Peer 节点来组成的,而且也是账本和智能合约的载体。 通过对上面交易过程的了解可以知道,Peer 节点是主要的参与方。如果用户想要访问账本资源,都必须要和 peer 节点进行交互。在一个 Peer 节点中,可以同时维护多个账本,这些账本属于不同的 Channel 。每个 Peer 节点都会维护一套冗余账本,这样就避免了单点故障。 Peer 节点根据在交易中的不同角色,可以分成背书节点(Endorser)和记账节点(Committer),背书节点会对交易进行模拟执行,记账节点才会真正将数据存储到账本中。 账本可以分成两个部分,一部分是区块链,另一部分是 Current State,也被称之为 World State。 区块链上只能追加,不能对过去的数据进行修改,链上也包含两部分信息,一部分是通道的配置信息,另一部分是不可修改,序列化的记录。每一个区块记录前一个区块的信息,然后连成链,如下图所示: 第一个区块被称之为 genesis block,其中不存储交易信息。每个区块可以被分为 区块头 、 区块数据 和 区块元数据 。区块头中存储着当前区块的区块号、当前区块的 hash 值和上一个区块的 hash 值,这样才能把所有的区块连接起来。区块数据中包含了交易数据。区块元数据中则包括了区块写入的时间、写入人及签名。 其中每一笔交易的结构如下,在 Header 中,包含了 ChainCode 的名称、版本信息。Signature 就是交易发起用户的签名。Proposal 中主要是一些参数。Response 中是智能合约执行的结果。Endorsements 中是背书结果返回的结果。 WorldState中维护了账本的当前状态,数据以 Key-Value 的形式存储,可以快速查询和修改,每一次对 WorldState 的修改都会被记录到区块链中。WorldState 中的数据需要依赖外部的存储,通常使用 LevelDB 或者 CouchDB。 区块链和 WorldState 组成了一个完整的账本,World State 保证的业务数据的灵活变化,而区块链则保证了所有的修改是可追溯和不可篡改的。 在交易完成之后,数据已经写入账本,就需要将这些数据同步到其他的 Peer,Fabric 中使用的是 Gossip 协议。Gossip 也是 Channel 隔离的,只会在 Channel 中的 Peer 中广播和同步账本数据。 智能合约需要安装到 Peer 节点上,智能合约是访问账本的唯一方式。智能合约可以通过 Go、Java 等变成语言进行编写。 智能合约编写完成之后,需要打包到 ChainCode 中,每个 ChainCode 中可以包含多个智能合约。ChainCode 需要安装,ChainCode 需要安装到 Peer 节点上。安装好了之后,ChainCode 需要在 Channel 上实例化,实例化的时候需要指定背书策略。 智能合约在实例化之后就可以用来与账本进行交互了,流程图如下: 用户编写并部署实例化智能合约之后,就可以通过客户端应用程序来向智能合约提交请求,智能合约会对 WorldState 中数据进行 get、put 或者 delete。其中 get 操作直接从 WorldState 中读取交易对象当前的状态信息,不会去区块链上写入信息,但 put 和 delete 操作除了修改 WorldState,还会去区块链中写入一条交易信息,且交易信息不能修改。 区块链上的信息可以通过智能合约访问,也可以在客户端应用通过 API 直接访问。 Event 是客户端应用和 Fabric 网络交互的一种方式,客户端应用可以订阅 Event,当 Event 发生时,客户端应用就会接受到消息。 事件源可以两类,一类是智能合约发出的 Event,另一类是账本变更触发的 Event。用户可以从 Event 中获取到交易的信息,比如区块高度等信息。 在这篇文章中,首先介绍了 Fabric 整体的网络架构,通过对 Fabric 交易流程的分析,讨论了 peer 节点在交易中的作用,然后详细分析了 peer 节点所维护的账本和智能合约,并分析了 peer 节点维护账本以及 peer 节点执行智能合约的流程。 文 / Rayjun [1] https://hyperledger-fabric.readthedocs.io/zh_CN/release-1.4/whatis.html [2] https://developer.ibm.com/zh/technologies/blockchain/series/os-academy-hyperledger-fabric/ [3] https://en.wikipedia.org/wiki/Gossip_protocol2023-07-03 16:14:421
区块链的核心技术是什么?
简单来说,区块链是一个提供了拜占庭容错、并保证了最终一致性的分布式数据库;从数据结构上看,它是基于时间序列的链式数据块结构;从节点拓扑上看,它所有的节点互为冗余备份;从操作上看,它提供了基于密码学的公私钥管理体系来管理账户。或许以上概念过于抽象,我来举个例子,你就好理解了。你可以想象有 100 台计算机分布在世界各地,这 100 台机器之间的网络是广域网,并且,这 100 台机器的拥有者互相不信任。那么,我们采用什么样的算法(共识机制)才能够为它提供一个可信任的环境,并且使得:节点之间的数据交换过程不可篡改,并且已生成的历史记录不可被篡改;每个节点的数据会同步到最新数据,并且会验证最新数据的有效性;基于少数服从多数的原则,整体节点维护的数据可以客观反映交换历史。区块链就是为了解决上述问题而产生的技术方案。二、区块链的核心技术组成无论是公链还是联盟链,至少需要四个模块组成:P2P 网络协议、分布式一致性算法(共识机制)、加密签名算法、账户与存储模型。1、P2P 网络协议P2P 网络协议是所有区块链的最底层模块,负责交易数据的网络传输和广播、节点发现和维护。通常我们所用的都是比特币 P2P 网络协议模块,它遵循一定的交互原则。比如:初次连接到其他节点会被要求按照握手协议来确认状态,在握手之后开始请求 Peer 节点的地址数据以及区块数据。这套 P2P 交互协议也具有自己的指令集合,指令体现在在消息头(Message Header) 的 命令(command)域中,这些命令为上层提供了节点发现、节点获取、区块头获取、区块获取等功能,这些功能都是非常底层、非常基础的功能。如果你想要深入了解,可以参考比特币开发者指南中的 Peer Discovery 的章节。2、分布式一致性算法在经典分布式计算领域,我们有 Raft 和 Paxos 算法家族代表的非拜占庭容错算法,以及具有拜占庭容错特性的 PBFT 共识算法。如果从技术演化的角度来看,我们可以得出一个图,其中,区块链技术把原来的分布式算法进行了经济学上的拓展。 在图中我们可以看到,计算机应用在最开始多为单点应用,高可用方便采用的是冷灾备,后来发展到异地多活,这些异地多活可能采用的是负载均衡和路由技术,随着分布式系统技术的发展,我们过渡到了 Paxos 和 Raft 为主的分布式系统。而在区块链领域,多采用 PoW 工作量证明算法、PoS 权益证明算法,以及 DPoS 代理权益证明算法,以上三种是业界主流的共识算法,这些算法与经典分布式一致性算法不同的是,它们融入了经济学博弈的概念,下面我分别简单介绍这三种共识算法。PoW: 通常是指在给定的约束下,求解一个特定难度的数学问题,谁解的速度快,谁就能获得记账权(出块)权利。这个求解过程往往会转换成计算问题,所以在比拼速度的情况下,也就变成了谁的计算方法更优,以及谁的设备性能更好。PoS: 这是一种股权证明机制,它的基本概念是你产生区块的难度应该与你在网络里所占的股权(所有权占比)成比例,它实现的核心思路是:使用你所锁定代币的币龄(CoinAge)以及一个小的工作量证明,去计算一个目标值,当满足目标值时,你将可能获取记账权。DPoS: 简单来理解就是将 PoS 共识算法中的记账者转换为指定节点数组成的小圈子,而不是所有人都可以参与记账。这个圈子可能是 21 个节点,也有可能是 101 个节点,这一点取决于设计,只有这个圈子中的节点才能获得记账权。这将会极大地提高系统的吞吐量,因为更少的节点也就意味着网络和节点的可控。3、加密签名算法在区块链领域,应用得最多的是哈希算法。哈希算法具有抗碰撞性、原像不可逆、难题友好性等特征。其中,难题友好性正是众多 PoW 币种赖以存在的基础,在比特币中,SHA256 算法被用作工作量证明的计算方法,也就是我们所说的挖矿算法。而在莱特币身上,我们也会看到 Scrypt 算法,该算法与 SHA256 不同的是,需要大内存支持。而在其他一些币种身上,我们也能看到基于 SHA3 算法的挖矿算法。以太坊使用了 Dagger-Hashimoto 算法的改良版本,并命名为 Ethash,这是一个 IO 难解性的算法。当然,除了挖矿算法,我们还会使用到 RIPEMD160 算法,主要用于生成地址,众多的比特币衍生代码中,绝大部分都采用了比特币的地址设计。除了地址,我们还会使用到最核心的,也是区块链 Token 系统的基石:公私钥密码算法。在比特币大类的代码中,基本上使用的都是 ECDSA。ECDSA 是 ECC 与 DSA 的结合,整个签名过程与 DSA 类似,所不一样的是签名中采取的算法为 ECC(椭圆曲线函数)。从技术上看,我们先从生成私钥开始,其次从私钥生成公钥,最后从公钥生成地址,以上每一步都是不可逆过程,也就是说无法从地址推导出公钥,从公钥推导到私钥。4、账户与交易模型从一开始的定义我们知道,仅从技术角度可以认为区块链是一种分布式数据库,那么,多数区块链到底使用了什么类型的数据库呢?我在设计元界区块链时,参考了多种数据库,有 NoSQL 的 BerkelyDB、LevelDB,也有一些币种采用基于 SQL 的 SQLite。这些作为底层的存储设施,多以轻量级嵌入式数据库为主,由于并不涉及区块链的账本特性,这些存储技术与其他场合下的使用并没有什么不同。区块链的账本特性,通常分为 UTXO 结构以及基于 Accout-Balance 结构的账本结构,我们也称为账本模型。UTXO 是“unspent transaction input/output”的缩写,翻译过来就是指“未花费的交易输入输出”。这个区块链中 Token 转移的一种记账模式,每次转移均以输入输出的形式出现;而在 Balance 结构中,是没有这个模式的。2023-07-03 16:14:511
redis怎么做数据库
单独使用Redis的话,它是成当不起数据库的任务,比如你每日活跃用户是1万人,但是你那台redis里面已经积累了50万人了(这个比例很正常),那么每次redis启动,就需要把50万load内存,每次redis备份,又需要把50万dump到磁盘,这靠谱么?======================补充1:可以用SSDB代替(redis协议+leveldb存储),生产环节若干 PCU百万级项目用过。补充2:看了下陌陌争霸的方案,旁路存储,如果觉得时间充足,也可以仿照实现。补充3:把冷数据落地到mongo,热数据在用redis存储。2023-07-03 16:14:582
如何将一维数据或其他非图像数据转换成lmdb
caffe事儿真多,数据必须得lmdb或者leveldb什么的才行,如果数据是图片的话,那用caffe自带的convert_image.cpp就行,但如果不是图片,就得自己写程序了。我也不是计算机专业的,我哪看得懂源码,遂奋发而百度之,然无甚结果,遂google之,尝闻“内事不决问百度,外事不决问google”,古人诚不我欺。在caffe的google group里我找到了这个网址代码如下:import numpy as npimport lmdbimport caffeN = 1000# Let"s pretend this is interesting dataX = np.zeros((N, 3, 32, 32), dtype=np.uint8)y = np.zeros(N, dtype=np.int64)# We need to prepare the database for the size. We"ll set it 10 times# greater than what we theoretically need. There is little drawback to# setting this too big. If you still run into problem after raising# this, you might want to try saving fewer entries in a single# transaction.map_size = X.nbytes * 10env = lmdb.open("mylmdb", map_size=map_size)with env.begin(write=True) as txn: # txn is a Transaction object for i in range(N): datum = caffe.proto.caffe_pb2.Datum() datum.channels = X.shape[1] datum.height = X.shape[2] datum.width = X.shape[3] datum.data = X[i].tobytes() # or .tostring() if numpy < 1.9 datum.label = int(y[i]) str_id = "{:08}".format(i) # The encode is only essential in Python 3 txn.put(str_id.encode("ascii"), datum.SerializeToString()) 这是用python将数据转为lmdb的代码,但是我用这个处理完数据再使用caffe会出现std::bad_alloc错误,后来经过艰苦地奋斗,查阅了大量资料,我发现了问题所在: 1.caffe的数据格式默认为四维(n_samples, n_channels, height, width) .所以必须把我的数据处理成这种格式 2.最后一行txn.put(str_id.encode("ascii"), datum.SerializeToString())一定要加上,我一开始一维python2不用写这个,结果老是出错,后来才发现这行必须写! 3.如果出现mdb_put: MDB_MAP_FULL: Environment mapsize limit reached的错误,是因为lmdb默认的map_size比较小,我把lmdb/cffi.py里面的map_size默认值改了一下,改成了1099511627776(也就是1Tb),我也不知道是不是这么改,然后我又把上面python程序里map_size = X.nbytes2023-07-03 16:15:061
如何在pycharm中使用vc 6.0
整了一晚上加一上午。网上关于python的记录较少,这里写一下。这里的环境是WIN10+cuda v7.5 +cudnn v4 + opencv + pycharm+VS2013使用的是GPU,我的GPU是titan16G+内存32G首先是caffe的文件以及第三方库的编译,这里提供一个已经编译好的的连接,我就是从那里下好然后编译完毕的。点击打开链接 happynear的然后就是如何编译python接口。1、首先先生成两个python文件,在src/caffe/proto/extract_proto.bat 里生成caffe_pb2.py 这个之后有用。2、然后打开已经给好的caffe/buildVS2013,打开里面已经有的工程文件,正常的情况下应该是有7个工程,选中pycaffee单独作为要编译的项目。如图所示:把pycaffe作为单启动。注意需要在release x64位下编译。如果没有这个的话,就将这个文件夹里python文件夹中的项目加入即可。如果没有python项目,就自己建一个,将python文件夹里的cpp文件加入就可以了。3、选择pycaffe的属性,将配置属性下的VC++目录中的包含目录和库目录填上你python所在的include和libs 再在C/C++的目录下的附加包含目录一项中添加以我的python为例。D:/python27/Lib;D:/python/include/ 以及D:/Python27/Lib/site-packages/numpy/core/include 如果你安装了CUDNN这里可以在预处理器那里把USE_CUDNN加上,同时在LINKER的输入目录下的附加依赖库中加入cudnn的lib文件。3、开始编译即可。这里要注意一定要和caffe、caffelib在一个项目里编译,否则会报错。4、编译成功后会在caffe/python/caffe下生成_caffe.pyd 是打不开的5、配置python环境:需要几个额外库Cython>=0.19.2numpy>=1.7.1scipy>=0.13.2scikit-image>=0.9.3matplotlib>=1.3.1ipython>=3.0.0h5py>=2.2.0leveldb>=0.191networkx>=1.8.1nose>=1.3.0pandas>=0.12.0python-dateutil>=1.4,<2protobuf>=2.5.0python-gflags>=2.0paml>=3.10Pillow>=2.3.0six>=1.1.0其中numpy要装MKL版本的,不然scipy装上了BLAS不能用leveldb没有windows版本的,不过我找到了可以使用的办法。见这个博客:点击打开链接如果有pip install 装不上的,可以上这个网站找 wheel文件安装就可以了点击打开链接6、最后把目录中python下的caffe文件夹复制到python27/Lib/site-packages就可以了。测试的时候只需要在控制台下输入import caffe 看能载入就知道成功了:)2023-07-03 16:15:442
nosql数据库有哪些
NoSQL太火,冒出太多产品了,保守估计也成百上千了。互联网公司常用的基本集中在以下几种,每种只举一个比较常见或者应用比较成功的例子吧。1. In-Memory KV Store : Redisin memory key-value store,同时提供了更加丰富的数据结构和运算的能力,成功用法是替代memcached,通过checkpoint和commit log提供了快速的宕机恢复,同时支持replication提供读可扩展和高可用。2. Disk-Based KV Store: Leveldb真正基于磁盘的key-value storage, 模型单一简单,数据量不受限于内存大小,数据落盘高可靠,Google的几位大神出品的精品,LSM模型天然写优化,顺序写盘的方式对于新硬件ssd再适合不过了,不足是仅提供了一个库,需要自己封装server端。3. Document Store: Mongodb分布式nosql,具备了区别mysql的最大亮点:可扩展性。mongodb 最新引人的莫过于提供了sql接口,是目前nosql里最像mysql的,只是没有ACID的特性,发展很快,支持了索引等特性,上手容易,对于数据量远超内存限制的场景来说,还需要慎重。4. Column Table Store: HBase这个富二代似乎不用赘述了,最大的优势是开源,对于普通的scan和基于行的get等基本查询,性能完全不是问题,只是只提供裸的api,易用性上是短板,可扩展性方面是最强的,其次坐上了Hadoop的快车,社区发展很快,各种基于其上的开源产品不少,来解决诸如join、聚集运算等复杂查询。2023-07-03 16:15:531
关于GoogleEarth或arcgis占空间的问题,请高手们解决一下
我的C盘下根本就没有GoogleEarthunified_cache_leveldb_leveldb2这个文件夹,如果在使用过程中大量产生冗余文件要么就是软件本身存在bug要么就是系统问题,就这个情况来看你多半得重装系统,我用arcmap处理DEM没有任何压力,处理速度和能力主要是看文件大小,我的电脑生成一个10G大小左右的DEM差不多用10分钟2023-07-03 16:16:014
nosql数据库有哪些???
NoSQL(NoSQL=NotOnlySQL),意即“不仅仅是SQL”,是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。随着大数据的不断发展,非关系型的数据库现在成了一个极其热门的新领域,非关系数据库产品的发展非常迅速。现今的计算机体系结构在数据存储方面要有庞大的水平扩展性,而NoSQL也正是致力于改变这一现状。目前Google的BigTable和Amazon的Dynamo使用的就是NoSQL型数据库,本文介绍了10种出色的NoSQL数据库。虽然NoSQL流行语火起来才短短一年的时间,但是不可否认,现在已经开始了第二代运动。尽管早期的堆栈代码只能算是一种实验,然而现在的系统已经更加的成熟、稳定。不过现在也面临着一个严酷的事实:技术越来越成熟——以至于原来很好的NoSQL数据存储不得不进行重写,也有少数人认为这就是所谓的2.0版本。这里列出一些比较知名的NoSQL工具,可以为大数据建立快速、可扩展的存储库。给一个地址吧http://www.caecp.cn/News/News-850.html2023-07-03 16:16:103
python 爬虫 ip池怎么做
无论是爬取IP,都能在本地设计动态代理IP池。这样既方便使用,又可以提升工作效率。那么怎么在本地设计一个代理IP池呢?IPIDEA为大家简述本地代理IP池的设计和日常维护。代理IP获取接口,如果是普通代理IP,使用ProxyGetter接口,从代理源网站抓取最新代理IP;如果是需耗费代理IP,一般都有提供获取IP的API,会有一定的限制,比如每次提取多少个,提取间隔多少秒。代理IP数据库,用以存放在动态VPS上获取到的代理IP,建议选择SSDB。SSDB的性能很突出,与Redis基本相当了,Redis是内存型,容量问题是弱项,并且内存成本太高,SSDB针对这个弱点,使用硬盘存储,使用Google高性能的存储引擎LevelDB,适合大数据量处理并把性能优化到Redis级别。代理IP检验计划,代理IP具备时效性,过有效期就会失效,因此 需要去检验有效性。设置一个定时检验计划,检验代理IP有效性,删除无效IP、高延时IP,同时预警,当IP池里的IP少于某个阈值时,根据代理IP获取接口获取新的IP。代理IP池外部接口除代理拨号服务器获取的代理IP池,还需要设计一个外部接口,通过这个接口调用IP池里的IP给爬虫使用。代理IP池功能比较简单,使用Flask就可以搞定。功能可以是给爬虫提供get/delete/refresh等接口,方便爬虫直接使用。2023-07-03 16:16:194
安装caffe一定要用cuda吗
如果你的caffe需要使用GPU计算,就一定要按照cuda,cuda相当于是专门用于GPU的语言。如果你只使用CPU计算,则不需要GPU,同理也就不需要cuda2023-07-03 16:16:342
hbase的特点,以及和其他nosql数据库的异同
NoSQL太火,冒出太多产品了,保守估计也成百上千了。互联网公司常用的基本集中在以下几种,每种只举一个比较常见或者应用比较成功的例子吧。1. In-Memory KV Store : Redisin memory key-value store,同时提供了更加丰富的数据结构和运算的能力,成功用法是替代memcached,通过checkpoint和commit log提供了快速的宕机恢复,同时支持replication提供读可扩展和高可用。2. Disk-Based KV Store: Leveldb真正基于磁盘的key-value storage, 模型单一简单,数据量不受限于内存大小,数据落盘高可靠,Google的几位大神出品的精品,LSM模型天然写优化,顺序写盘的方式对于新硬件ssd再适合不过了,不足是仅提供了一个库,需要自己封装server端。3. Document Store: Mongodb分布式nosql,具备了区别mysql的最大亮点:可扩展性。mongodb 最新引人的莫过于提供了sql接口,是目前nosql里最像mysql的,只是没有ACID的特性,发展很快,支持了索引等特性,上手容易,对于数据量远超内存限制的场景来说,还需要慎重。4. Column Table Store: HBase这个富二代似乎不用赘述了,最大的优势是开源,对于普通的scan和基于行的get等基本查询,性能完全不是问题,只是只提供裸的api,易用性上是短板,可扩展性方面是最强的,其次坐上了Hadoop的快车,社区发展很快,各种基于其上的开源产品不少,来解决诸如join、聚集运算等复杂查询。2023-07-03 16:16:421
region下所有的hfile默认存放
HBase 是 Google Bigtable 的开源实现,是一个 sparse, distributed, persistent multi- dimensional sorted map,map 的 key 由 rowkey,column family,qualifier,timestamp,type 组成,并据此排序。架构图Hbase 的架构是存算分离的,方便扩展,底层存储使用 HDFS,HBase 相关组件提供计算功能,部分元数据存储在 ZK 中。架构图如下:数据模型table:表,一个表包含多行数据row:行,一行数据包含一个唯一标识 rowkey、多个 column 以及对应的值。在 HBase 中,一张表中所有 row 都按照 rowkey 的字典序由小到大排序。column:列,与关系型数据库中的列不同,HBase 中的 column 由 column family(列簇)以及 qualifier(列名)两部分组成,两者中间使用":"相连。比如 contents:html,其中 contents 为列簇,html 为列簇下具体的一列。column family 在表创建的时候需要指定,不能随意增减。一个 column family 下可以有任意多个 qualifier,也就是 HBase 中的列可以动态增加,理论上甚至可以扩展到上百万列。timestamp:时间戳,每个 cell 在写入 HBase 的时候都会默认分配一个时间戳作为该 cell 的版本,当然,用户也可以在写入的时候自带时间戳。HBase 支持多版本特性,即同一 rowkey、column 下可以有多个 value 存在,这些 value 使用 timestamp 作为版本号,版本越大,表示数据越新。cell:单元格,由五元组(row, column, timestamp, type, value)组成的结构,其中 type 表示 Put/Delete 这样的操作类型,timestamp 代表这个 cell 的版本。这个结构在数据库中实际是以 KV 结构存储的,其中(row, column, timestamp, type)是 K,value 字段对应 KV 结构的 V。在每个 HFile 文件中,KV 按序存储,按照 KV 中 key 的字典序进行排序。先比较 rowkey,rowkey 小的排在前面;如果 rowkey 相同,再比较 column,即 column family:qualifier,column 小的排在前面;如果 column 还相同,再比较时间戳 timestamp,即版本信息,timestamp 大的排在前面(也就是最新的排在前面)。数据文件的物理存储HFile 在 HDFS 上按照 table、region、column family 分目录存储,如下所示:/hbase/data/default/table-name/region-name/column-family-name/hfile-name其中 default 是默认 namespace,一个列簇下的所有 HFile 文件都在同一个列簇目录下,按照文件的新旧程度放置在 LSM-tree 的不同 level,每个 level 只有一个 HFile 文件。CompactMinor Compact:选取部分尺寸小的、LSM-tree 中相邻 level 的 HFile,将它们合并成更大的 HFile,但是不清理 type 为 deletes 或 expired versions 的数据。Major Compact:将一个 Store 中所有的 HFile 合并成一个 HFile,由于只有一个 HFile 文件,这个文件可能会很大,这也是 HFile 文件结构中索引是多层结构的原因。这个过程还会完全清理三类无意义数据:被删除的数据、TTL 过期数据、版本号超过设定版本号的数据。RegionServer一个 RegionServe r由一个(或多个)HLog、一个 BlockCache 以及多个 Region 组成。其中,HLog 用作 WAL;BlockCache 可以将 block 缓存在内存中以提升数据读取性能;Region 是 HBase 中数据表的一个数据分片,一个 RegionServer 通常会负责多个 Region 的数据读写,Region 可以来自相同或不同表。Region 由多个 Store 组成,一个 Store 负责一个列簇的数据,比如一个表中有两个列簇,这个表的所有 Region 就都会包含两个 Store。每个 Store 包含一个 MemStore 和多个 HFile,用户数据写入时会先写 HLog,然后将对应列簇数据写入相应的 MemStore,一旦 MemStore 大小超过设定阈值,系统就会将 MemStore 中的数据落盘形成 HFile 文件,HFile 存放在HDFS上。这里 HLog、MemStore、HFile 与 LevelDB 中对应的相关文件:日志文件、memtable、sstable,格式也有相似之处,先不展开介绍。ACIDHBase 保证单行事务的 ACID 特性,跨行无法保证。作为该限制的结果之一就是不支持辅助索引,对数据项的更新需要同时对辅助索引进行更新,而这不是原子的。单行事务的保证是通过将单行中涉及的多个 column 修改编码为一条 WAL 来完成的,即使跨多个 column family 也可以。hbase:meta 表hbase:meta 表就是分区表,分区表作用可以参考狂奔的蜗牛:可扩展性之数据分区该表存储了 Region 到 Region Server 的映射,用来路由 client 读写请求、进行负载均衡等操作。该表的所在 RS 节点存储在 ZK 上。表结构如下:KeyRegion key of the format ([table],[region start key],[region id])Valuesinfo:regioninfo (serialized HRegionInfo instance for this region)info:server (server:port of the RegionServer containing this region)info:serverstartcode (start-time of the RegionServer process containing this region)当 Region 发生 split 时候,values 中会新建两列:info:splitA 和 info:splitB。这两列代表两个新的子 Region,列值同 info:regioninfo 一样,也是 serialized HRegionInfo instance,在 Region 完成 split 后,对应的旧行将被删除。空的 start key 表示 HBase 一张表的 start 或者 end,hbase:meta 表中如果一个 Region 有空的 start key,那么这个 Region 是对应表的第一个 Region,如果 start key 和 end key 都为空,那么这个 Region 是表的唯一 Region。Region 的划分使用范围分区策略,按照 rowkey 划分。数据写入客户端将用户的写入请求进行预处理,并根据集群元数据定位写入数据所在的 RegionServer,将请求发送给对应的 RegionServer。RegionServer 接收到写入请求之后,先写 WAL,再写入对应 Region 列簇的 MemStore。当 Region 中 MemStore 容量超过一定阈值,系统会异步执行 flush 操作,将内存中的数据写入 HFile。数据读取读取有 get 和 scan 两种 API,get 通常根据给定 rowkey 查找一行记录,scan 通常根据给定的 start key 和 stop key查找多行满足条件的记录。技术实现上,get 是特殊的 scan,scan 的条数为 1。scan 并没有设计为一次 RPC 请求,因为一次 scan 操作的扫描结果可能数据量非常大。HBase 会根据设置条件将一次大的 scan 拆分为多个 RPC 请求,每个 RPC 请求称为一次 next 请求,每次只返回规定数量的结果。1、client 根据集群元数据定位查询数据所在的 RegionServer,将请求发送给对应的 RegionServer。2、对包含用户查询数据的 Region 的 HFile 进行过滤,过滤方法主要有三种:根据 KeyRange 过滤:因为 HFile 中所有 KeyValue 数据都是有序的,所以如果待检索 row 范围 [ start row,stop row ] 与文件起始 key 范围 [ first key,last key ] 没有交集,就可以过滤掉该 HFIle。根据 TimeRange 过滤:HFile 中元数据有一个关于该 File 的 TimeRange 属性 [ miniTimestamp, maxTimestamp ],如果待检索的 TimeRange 与该文件时间范围没有交集,就可以过滤掉该 HFile;另外,如果该文件所有数据已经过期,也可以过滤淘汰。根据布隆过滤器进行过滤:根据待检索的 rowkey 获取对应的 Bloom Block 并加载到内存(通常情况下,热点 Bloom Block 常驻内存),使用布隆过滤器中的数据确定待检索 rowkey 是否一定不存在于该 HFile。3、从剩余 HFile 中读取待查找 key:首先根据 HFile 中的索引定位目标 block,然后看 Block Cache 中是否存在,不存在则从 HDFS 中 seek 读取,之后在 block 中顺序查找指定 key。由于不同 HFile 文件之间的数据是无序的,因此需要归并排序,实际上 MemStore 使用 MemStoreScanner 读取数据,HFile 使用 StoreFileScanner 读取数据,最后 KeyValueScanner 将使用 MemStoreScanner 和多个 StoreFileScanner 来构建最小堆,保证所有数据有序。2023-07-03 16:16:491
caffe windows10 vs2013怎么配置
1.配置环境我在自己的笔记本配置的caffe,配置的环境为:Windows 7 64位 + cuda6.5 + Opencv2.49 +VS2013。假设在配置caffe之前,你已经准备好这些。本文中将给出一些编译好的依赖库,如果你也是用的Windows 7 64位+VS2013,可以直接使用。2.准备依赖库在Windows下配置caffe,一个很主要的问题就是依赖库的编译。不像在Ubuntu下那么方便,在Windows下,依赖库都需要使用vs2013进行编译才能使用。下面我将介绍caffe需要的依赖库(如果你也是win7 64位+VS2013,可以直接使用我提供的依赖库)。2.1 boostboost可以下载源码进行编译,也可以直接下载安装文件。我使用的是后者,方便、快捷。我使用的是:boost_1.56_0-msvc-12.0-64.exe注意下载适合你的配置环境的boost版本即可。下载完毕,双击运行安装文件即可。2.2 Glog+Gflag+Protobuf+LevelDB+HDF5+LMDB+Openblas这一部分的很多都是谷歌的开源库,不容易下载(你懂的)。所以我使用的是Neil Z. SHAO‘s Blog提供的编译好的。下载完,解压得到3rdparty文件夹。在下一段将会用到。3.建立caffe工程准备好了caffe需要的依赖库和环境之后,下面就可以建立caffe的vs项目,进行编译了。3.1 下载caffe源码可以从caffe的github主页下载源码。下载地址:Caffe"s GitHub解压文件,假设caffe源码所在目录为CAFFE_ROOT。3.2 准备项目需要的依赖库和系统环境变量经过上一阶段的准备,caffe项目所需的依赖库都已经准备好。1.首先设置系统环境变量(以我的为例):CUDA_PATH_V6_5 安装好cuda6.5之后,会自动添加环境变量CUDA_PATH_V6_5OPENCV_2_49 D:/Tools/opencv2.49/build/BOOST_1_56 D:/Tools/boost_1_56_02.将3rdparty文件夹放到CAFFE_ROOT3.3 用vs建立caffe项目1.用VS2013在CAFFE_ROOT下建立 win32 console application,选择空项目。将项目的平台由32位改为64位2.修改项目属性项目——属性——C/C++——常规——附加包含目录添加:../include;../src;../3rdparty/include;../3rdparty;../3rdparty/include;../3rdparty/include/openblas;../3rdparty/include/hdf5;../3rdparty/include/lmdb;../3rdparty/include/leveldb;../3rdparty/include/gflag;../3rdparty/include/glog;../3rdparty/include/google/protobuf;项目——属相——VC++目录——包含目录添加:$(CUDA_PATH_V6_5)include;$(OPENCV_2_49)include;$(OPENCV_2_49)includeopencv;$(OPENCV_2_49)includeopencv2;$(BOOST_1_56)项目——属性——链接器——常规——附加库目录添加:$(CUDA_PATH_V6_5)lib$(PlatformName);$(OPENCV_2_49)x64vc12lib;$(BOOST_1_56)lib64-msvc-12.0;..3rdpartylib;项目——属性——链接器——输入——附加依赖项debug添加:opencv_ml249d.libopencv_calib3d249d.libopencv_contrib249d.libopencv_core249d.libopencv_features2d249d.libopencv_flann249d.libopencv_gpu249d.libopencv_highgui249d.libopencv_imgproc249d.libopencv_legacy249d.libopencv_objdetect249d.libopencv_ts249d.libopencv_video249d.libopencv_nonfree249d.libopencv_ocl249d.libopencv_photo249d.libopencv_stitching249d.libopencv_superres249d.libopencv_videostab249d.libcudart.libcuda.libnppi.libcufft.libcublas.libcurand.libgflagsd.liblibglog.liblibopenblas.dll.alibprotobufd.liblibprotoc.libleveldbd.liblmdbd.liblibhdf5_D.liblibhdf5_hl_D.libShlwapi.libgflags.liblibprotobuf.libleveldb.liblmdb.liblibhdf5.liblibhdf5_hl.librelease添加:opencv_ml249.libopencv_calib3d249.libopencv_contrib249.libopencv_core249.libopencv_features2d249.libopencv_flann249.libopencv_gpu249.libopencv_highgui249.libopencv_imgproc249.libopencv_legacy249.libopencv_objdetect249.libopencv_ts249.libopencv_video249.libopencv_nonfree249.libopencv_ocl249.libopencv_photo249.libopencv_stitching249.libopencv_superres249.libopencv_videostab249.libcudart.libcuda.libnppi.libcufft.libcublas.libcurand.libgflags.liblibglog.liblibopenblas.dll.alibprotobuf.liblibprotoc.libleveldb.liblmdb.liblibhdf5.liblibhdf5_hl.libShlwapi.lib3.4 编译caffe配置好caffe项目的属性之后,下面就可以一步一步的编译caffe了。3.4.1 编译./src中的文件首先,将../src文件夹中的*.cpp文件添加到工程中。依次编译每一个*.cpp文件。1.编译blob.cpp直接编译时会报错,缺少文件”caffeprotocaffe.pb.h”这个时候需要将proto.exe放到../3rdparty/bin文件夹将GernaratePB.bat放在../scripts文件夹运行bat脚本文件即可生成caffe.pb.h然后就可以成功编译。2.编译common.cpp直接编译这个文件,会出现关于getid和fopen_s的错误。可通过如下步骤修改:在代码前面添加:#include <process.h>修改项目属性:项目——属性——C/C++——预处理器——预处理器定义添加:_CRT_SECURE_NO_WARNINGS在代码中getid的位置进行如下修改:#ifdef _MSC_VERpid = getid();#elsepid = _getid();#endf修改完毕之后,可以成功编译。3.编译net.cpp直接编译这个文件,会出现关于mkstep、close、mkdtemp的错误。需要进行如下修改:在io.hpp头文件中添加:#include “mkstep.h”在io.hpp头文件中,在close()的位置进行如下修改:#ifdef _MSC_VERclose(fd);#else_close(fd);#endif在mkdtemp的位置进行如下修改:#ifndef _MSC_VERchar* mkdtemp_result = mkdtemp(temp_dirname_cstr);#elseerrno_t mkdtemp_result = _mktemp_s(temp_dirname_cstr, sizeof(temp_dirname_cstr));#endif修改完毕,可以成功编译。4.编译solver.cpp直接编译会出现关于snprintf的错误,需要进行如下修改:#ifdef _MSC_VER#define snprinf sprintf_s#endif修改完毕,可以成功编译。5.其他剩余的cpp文件也依次编译3.4.2 编译./src/layers中的文件将./src/layers中的所有的cpp和cu文件都添加到项目中。右键点击cu文件,修改属性。在bnll_layer.cu文件,进行如下修改:float kBNLL_THRESHOLD = 50 ——> #define kBNLL_THRESHOLD 50.0依次编译所有的文件。3.4.3 编译./src/util中的文件将./src/util中所有的文件添加到项目1.在io.cpp中修改ReadProtoFromBinaryFile函数O_RDONLY ——> O_RDONLY | O_BINARY在代码中进行如下修改:#ifdef _MSC_VER#define open _open#endif将close()改为_close()2.在math_functions.cpp中做如下修改:#define __builtin_popcount __popcnt#define __builtin_popcountl __popcnt3.在db.cpp中作如下修改:#ifdef _MSC_VER#include <direct.h>#endif修改CHECK_EQ#ifdef _MSC_VERCHECK_EQ(_mkdir(source.c_str()),0)<<”mkdir”<<source<<”failed”;#elseCHECK_EQ(mkdir(source.c_str(),0744),0)<<”mkidr”<<source<<”failed”;#endif4.依次编译其他文件3.4.4 编译./src/proto中的文件参照上一步,将proto中的文件都添加到项目。修改属性:项目——属性——C/C++——预处理器——预处理器定义添加:_SCL_SECURE_NO_WARNINGS编译所有文件。3.4.5 编译./tools中的文件本文件夹下有多个cpp文件,通过它们的名字就可以知道相应的功能。添加不同的cpp文件到项目中,然后生成项目,就可以得到不同功能的exe文件。将caffe.cpp添加到工程,生成项目,得到caffe.exe文件,可用于训练模型将computer_image_mean.cpp添加到工程,生成项目,得到的exe文件可用于将训练样本转换为caffe使用的leveldb/lmdb数据集。依次类推。自此,caffe在Windows下的编译已经完毕,接下来就可以使用它来训练自己的模型了。2023-07-03 16:16:561
怎样操作leveldb数据库,实现增删改查
下文例子中演示了如何插入、获取、删除一条记录LevelDB 简介一、LevelDB入门LevelDB是Google开源的持久化KV单机数据库,具有很高的随机写,顺序读/写性能,但是随机读的性能很一般,也就是说,LevelDB很适合应用在查询较少,而写很多的场景。LevelDB应用了LSM (Log Structured Merge) 策略,lsm_tree对索引变更进行延迟及批量处理,并通过一种类似于归并排序的方式高效地将更新迁移到磁盘,降低索引插入开销,关于LSM,本文在后面也会简单提及。根据LevelDB官方网站的描述,LevelDB的特点和限制如下:特点:1、key和value都是任意长度的字节数组;2、entry(即一条K-V记录)默认是按照key的字典顺序存储的,当然开发者也可以重载这个排序函数;3、提供的基本操作接口:Put()、Delete()、Get()、Batch();4、支持批量操作以原子操作进行;5、可以创建数据全景的snapshot(快照),并允许在快照中查找数据;6、可以通过前向(或后向)迭代器遍历数据(迭代器会隐含的创建一个snapshot);7、自动使用Snappy压缩数据;8、可移植性;限制:1、非关系型数据模型(NoSQL),不支持sql语句,也不支持索引;2、一次只允许一个进程访问一个特定的数据库;3、没有内置的C/S架构,但开发者可以使用LevelDB库自己封装一个server;LevelDB本身只是一个lib库,在源码目录make编译即可,然后在我们的应用程序里面可以直接include leveldb/include/db.h头文件,该头文件有几个基本的数据库操作接口,下面是一个测试例子:#include <iostream>#include <string>#include <assert.h> #include "leveldb/db.h" using namespace std;int main(void) { leveldb::DB *db; leveldb::Options options; options.create_if_missing = true; // open leveldb::Status status = leveldb::DB::Open(options,"/tmp/testdb", &db); assert(status.ok()); string key = "name"; string value = "chenqi"; // write status = db->Put(leveldb::WriteOptions(), key, value); assert(status.ok()); // read status = db->Get(leveldb::ReadOptions(), key, &value); assert(status.ok()); cout<<value<<endl; // delete status = db->Delete(leveldb::WriteOptions(), key); assert(status.ok()); status = db->Get(leveldb::ReadOptions(),key, &value); if(!status.ok()) { cerr<<key<<" "<<status.ToString()<<endl; } else { cout<<key<<"==="<<value<<endl; } // close delete db; return 0; }上面的例子演示了如何插入、获取、删除一条记录,编译代码:g++ -o test test.cpp libleveldb.a -lpthread -Iinclude执行./test后,会在/tmp下面生成一个目录testdb,里面包含若干文件:------------------------------------------------------------LevelDB是google开源的一个key-value存储引擎库,类似于开源的Lucene索引库一样。其他的软件开发者可以利用该库做二次开发,来满足定制需求。LevelDB采用日志式的写方式来提高写性能,但是牺牲了部分读性能。为了弥补牺牲了的读性能,一些人提议使用SSD作为存储介质。对于本地化的Key-value存储引擎来说,简单的使用一般都分成三个基本的步骤:(1)打开一个数据库实例;(2)对这个数据库实例进行插入,修改和查询操作;(3)最后在使用完成之后,关闭该数据库。下面将详细讨论该三个步骤:一、打开一个数据库实例一个leveldb数据库有一个对应一个文件系统目录的名字。该数据库的所有内容都存储在这个目录下。下面的代码描述了怎样打开一个数据库或者建立一个新的数据库。#include <assert.h> #include "leveldb/db.h" leveldb::DB* db; leveldb::Options options; options.create_if_missing = true; leveldb::Status status = leveldb::DB::Open(options,"/tmp/testdb", &db); assert(status.ok()); 如果打开已存在数据库的时候,需要抛出错误。将以下代码插在leveldb::DB::Open方法前面: options.error_if_exists = true;二、对数据库的简单读、写操作LevelDB提供了Put,Delete和Get三个方法对数据库进行修改和查询。例如,下面的代码片段描述了怎样将key1对应的value值,移到key2对应的值。std::string value; leveldb::Status s = db->Get(leveldb::ReadOptions(), key1, &value); if(s.ok()) s = db->Put(leveldb::WriteOptions(), key2, value); if(s.ok()) s = db->Delete(leveldb::WriteOptions(), key1);三、关闭数据库在对数据库进行了一系列的操作之后,需要对数据库进行关闭。该操作比较简单:... open the db as described above... ... do something with db ... delete db;上面对levelDB的简单使用做了基本的介绍,接下来就是如何自己写一个完成并且能运行的例子。1、下载源码 git clone https://code.google.com/p/leveldb/2、编译源码 cd leveldb && make all3、编写test.cpp#include <assert.h> #include <string.h> #include <leveldb/db.h> #include <iostream> int main(){ leveldb::DB* db; leveldb::Options options; options.create_if_missing = true; leveldb::Status status = leveldb::DB::Open(options,"/tmp/testdb", &db); assert(status.ok()); //write key1,value1 std::string key="key"; std::string value = "value"; status = db->Put(leveldb::WriteOptions(), key,value); assert(status.ok()); status = db->Get(leveldb::ReadOptions(), key, &value); assert(status.ok()); std::cout<<value<<std::endl; std::string key2 = "key2"; //move the value under key to key2 status = db->Put(leveldb::WriteOptions(),key2,value); assert(status.ok()); status = db->Delete(leveldb::WriteOptions(), key); assert(status.ok()); status = db->Get(leveldb::ReadOptions(),key2, &value); assert(status.ok()); std::cout<<key2<<"==="<<value<<std::endl; status = db->Get(leveldb::ReadOptions(),key, &value); if(!status.ok()) std::cerr<<key<<" "<<status.ToString()<<std::endl; else std::cout<<key<<"==="<<value<<std::endl; delete db; return 0; }4、编译链接 g++ -o test test.cpp ../leveldb/libleveldb.a -lpthread -I../leveldb/include 注意libleveldb.a 和leveldb include的路径。5、运行结果./test:value key2===value key NotFound:2023-07-03 16:17:151
怎样操作leveldb数据库,实现增删改查
下文例子中演示了如何插入、获取、删除一条记录LevelDB 简介一、LevelDB入门LevelDB是Google开源的持久化KV单机数据库,具有很高的随机写,顺序读/写性能,但是随机读的性能很一般,也就是说,LevelDB很适合应用在查询较少,而写很多的场景。LevelDB应用了LSM (Log Structured Merge) 策略,lsm_tree对索引变更进行延迟及批量处理,并通过一种类似于归并排序的方式高效地将更新迁移到磁盘,降低索引插入开销,关于LSM,本文在后面也会简单提及。根据LevelDB官方网站的描述,LevelDB的特点和限制如下:特点:1、key和value都是任意长度的字节数组;2、entry(即一条K-V记录)默认是按照key的字典顺序存储的,当然开发者也可以重载这个排序函数;3、提供的基本操作接口:Put()、Delete()、Get()、Batch();4、支持批量操作以原子操作进行;5、可以创建数据全景的snapshot(快照),并允许在快照中查找数据;6、可以通过前向(或后向)迭代器遍历数据(迭代器会隐含的创建一个snapshot);7、自动使用Snappy压缩数据;8、可移植性;限制:1、非关系型数据模型(NoSQL),不支持sql语句,也不支持索引;2、一次只允许一个进程访问一个特定的数据库;3、没有内置的C/S架构,但开发者可以使用LevelDB库自己封装一个server;LevelDB本身只是一个lib库,在源码目录make编译即可,然后在我们的应用程序里面可以直接include leveldb/include/db.h头文件,该头文件有几个基本的数据库操作接口,下面是一个测试例子:#include <iostream>#include <string>#include <assert.h> #include "leveldb/db.h" using namespace std;int main(void) { leveldb::DB *db; leveldb::Options options; options.create_if_missing = true; // open leveldb::Status status = leveldb::DB::Open(options,"/tmp/testdb", &db); assert(status.ok()); string key = "name"; string value = "chenqi"; // write status = db->Put(leveldb::WriteOptions(), key, value); assert(status.ok()); // read status = db->Get(leveldb::ReadOptions(), key, &value); assert(status.ok()); cout<<value<<endl; // delete status = db->Delete(leveldb::WriteOptions(), key); assert(status.ok()); status = db->Get(leveldb::ReadOptions(),key, &value); if(!status.ok()) { cerr<<key<<" "<<status.ToString()<<endl; } else { cout<<key<<"==="<<value<<endl; } // close delete db; return 0; }上面的例子演示了如何插入、获取、删除一条记录,编译代码:g++ -o test test.cpp libleveldb.a -lpthread -Iinclude执行./test后,会在/tmp下面生成一个目录testdb,里面包含若干文件:------------------------------------------------------------LevelDB是google开源的一个key-value存储引擎库,类似于开源的Lucene索引库一样。其他的软件开发者可以利用该库做二次开发,来满足定制需求。LevelDB采用日志式的写方式来提高写性能,但是牺牲了部分读性能。为了弥补牺牲了的读性能,一些人提议使用SSD作为存储介质。对于本地化的Key-value存储引擎来说,简单的使用一般都分成三个基本的步骤:(1)打开一个数据库实例;(2)对这个数据库实例进行插入,修改和查询操作;(3)最后在使用完成之后,关闭该数据库。下面将详细讨论该三个步骤:一、打开一个数据库实例一个leveldb数据库有一个对应一个文件系统目录的名字。该数据库的所有内容都存储在这个目录下。下面的代码描述了怎样打开一个数据库或者建立一个新的数据库。#include <assert.h> #include "leveldb/db.h" leveldb::DB* db; leveldb::Options options; options.create_if_missing = true; leveldb::Status status = leveldb::DB::Open(options,"/tmp/testdb", &db); assert(status.ok()); 如果打开已存在数据库的时候,需要抛出错误。将以下代码插在leveldb::DB::Open方法前面: options.error_if_exists = true;二、对数据库的简单读、写操作LevelDB提供了Put,Delete和Get三个方法对数据库进行修改和查询。例如,下面的代码片段描述了怎样将key1对应的value值,移到key2对应的值。std::string value; leveldb::Status s = db->Get(leveldb::ReadOptions(), key1, &value); if(s.ok()) s = db->Put(leveldb::WriteOptions(), key2, value); if(s.ok()) s = db->Delete(leveldb::WriteOptions(), key1);三、关闭数据库在对数据库进行了一系列的操作之后,需要对数据库进行关闭。该操作比较简单:... open the db as described above... ... do something with db ... delete db;上面对levelDB的简单使用做了基本的介绍,接下来就是如何自己写一个完成并且能运行的例子。1、下载源码 git clone https://code.google.com/p/leveldb/2、编译源码 cd leveldb && make all3、编写test.cpp#include <assert.h> #include <string.h> #include <leveldb/db.h> #include <iostream> int main(){ leveldb::DB* db; leveldb::Options options; options.create_if_missing = true; leveldb::Status status = leveldb::DB::Open(options,"/tmp/testdb", &db); assert(status.ok()); //write key1,value1 std::string key="key"; std::string value = "value"; status = db->Put(leveldb::WriteOptions(), key,value); assert(status.ok()); status = db->Get(leveldb::ReadOptions(), key, &value); assert(status.ok()); std::cout<<value<<std::endl; std::string key2 = "key2"; //move the value under key to key2 status = db->Put(leveldb::WriteOptions(),key2,value); assert(status.ok()); status = db->Delete(leveldb::WriteOptions(), key); assert(status.ok()); status = db->Get(leveldb::ReadOptions(),key2, &value); assert(status.ok()); std::cout<<key2<<"==="<<value<<std::endl; status = db->Get(leveldb::ReadOptions(),key, &value); if(!status.ok()) std::cerr<<key<<" "<<status.ToString()<<std::endl; else std::cout<<key<<"==="<<value<<std::endl; delete db; return 0; }4、编译链接 g++ -o test test.cpp ../leveldb/libleveldb.a -lpthread -I../leveldb/include 注意libleveldb.a 和leveldb include的路径。5、运行结果./test:value key2===value key NotFound:2023-07-03 16:17:221
cifar10的代码放在github哪个目录下
1 cifar10数据库 60000张32*32 彩色图片 共10类 50000张训练 10000张测试 下载cifar10数据库 这是binary格式的,所以我们要把它转换成leveldb格式。 2 在../caffe-windows/examples/cifar10文件夹中有一个 convert_cifar_data.cpp 将他include到MainCaller.cpp中。如下: 编译....我是一次就通过了 ,在bin文件夹里出现convert_cifar_data.exe。然后 就可以进行格式转换。binary→leveldb 可以在bin文件夹下新建一个input文件夹。将cifar10.binary文件放在input文件夹中,这样转换时就不用写路径了。 cmd进入bin文件夹 执行后,在output文件夹下有cifar_train_leveldb和cifar_test_leveldb两个文件夹。里面是转化好的leveldb格式数据。 当然,也可以写一个bat文件处理,方便以后再次使用。2023-07-03 16:17:301
目前常用的手写字体(数字,字母,汉字)数据集有哪些?
2023-07-03 16:17:381
怎样运行.prototxt文件
1 cifar10数据库 60000张32*32 彩色图片 共10类 50000张训练 10000张测试 下载cifar10数据库 这是binary格式的,所以我们要把它转换成leveldb格式。 2 在../caffe-windows/examples/cifar10文件夹中有一个 convert_cifar_data.cpp 将他include到MainCaller.cpp中。如下: 编译....我是一次就通过了 ,在bin文件夹里出现convert_cifar_data.exe。然后 就可以进行格式转换。binary→leveldb 可以在bin文件夹下新建一个input文件夹。将cifar10.binary文件放在input文件夹中,这样转换时就不用写路径了。 cmd进入bin文件夹 执行后,在output文件夹下有cifar_train_leveldb和cifar_test_leveldb两个文件夹。里面是转化好的leveldb格式数据。 当然,也可以写一个bat文件处理,方便以后再次使用。 3 下面我们要求数据图像的均值 编译../../tools/comput_image_mean.cpp 编译成功后。接下来求mean cmd进入bin。 执行后,在bin文件夹下出现一个mean.binaryproto文件,这就是所需的均值文件。 4 训练cifar网络 在.../examples/cifar10文件夹里已经有网络的配置文件,我们只需要将cifar_train_leveldb和cifar_test_leveldb两个文件夹还有mean.binaryproto文件拷到cifar0文件夹下。 修改cifar10_quick_train.prototxt中的source: "cifar-train-leveldb" mean_file: "mean.binaryproto" 和cifar10_quick_test.prototxt中的source: "cifar-test-leveldb" mean_file: "mean.binaryproto"就可以了, 后面再训练就类似于MNIST的训练。写一个train_quick.bat,内容如下: [plain] view plaincopy copy ..\..\bin\MainCaller.exe ..\..\bin\train_net.exe SET GLOG_logtostderr=1 "../../bin/train_net.exe" cifar10_quick_solver.prototxt pause 先编译一遍 train_net.cpp 运行train_quick.bat2023-07-03 16:17:451
数据库有哪几种
数据库有两种类型,分别是关系型数据库与非关系型数据库。1、关系数据库包括:MySQL、MariaDB(MySQL的代替品,英文维基百科从MySQL转向MariaDB)、Percona Server(MySQL的代替品)、PostgreSQL、Microsoft Access、Microsoft SQL Server、Google Fusion Tables。FileMaker、Oracle数据库、Sybase、dBASE、Clipper、FoxPro、foshub。几乎所有的数据库管理系统都配备了一个开放式数据库连接(ODBC)驱动程序,令各个数据库之间得以互相集成。2、非关系型数据库(NoSQL)包括:BigTable(Google)、Cassandra、MongoDB、CouchDB、键值(key-value)数据库、Apache Cassandra(为Facebook所使用):高度可扩展、Dynamo、LevelDB(Google)。扩展资料:数据库的作用数据库管理系统是为管理数据库而设计的电脑软件系统,一般具有存储、截取、安全保障、备份等基础功能。数据库管理系统可以依据它所支持的数据库模型来作分类,例如关系式、XML;或依据所支持的计算机类型来作分类,例如服务器群集、移动电话。或依据所用查询语言来作分类,例如SQL、XQuery;或依据性能冲量重点来作分类,例如最大规模、最高运行速度;亦或其他的分类方式。不论使用哪种分类方式,一些DBMS能够跨类别,例如,同时支持多种查询语言。参考资料来源:百度百科--数据库2023-07-03 16:17:531
请问数据库有哪些种类呢?
数据库共有3种类型,为关系数据库、非关系型数据库和键值数据库。1、关系数据库MySQL、MariaDB(MySQL的代替品,英文维基百科从MySQL转向MariaDB)、Percona Server(MySQL的代替品·)、PostgreSQL、Microsoft Access、Microsoft SQL Server、Google Fusion Tables、FileMaker、Oracle数据库、Sybase、dBASE、Clipper、FoxPro、foshub。几乎所有的数据库管理系统都配备了一个开放式数据库连接(ODBC)驱动程序,令各个数据库之间得以互相集成。2、非关系型数据库(NoSQL)BigTable(Google)、Cassandra、MongoDB、CouchDB。3、键值(key-value)数据库Apache Cassandra(为Facebook所使用):高度可扩展、Dynamo、LevelDB(Google)。扩展资料:数据库模型:对象模型、层次模型(轻量级数据访问协议)、网状模型(大型数据储存)、关系模型、面向对象模型、半结构化模型、平面模型(表格模型,一般在形式上是一个二维数组。如表格模型数据Excel)。数据库的架构可以大致区分为三个概括层次:内层、概念层和外层。参考资料来源:百度百科—数据库2023-07-03 16:18:111
MySQL数据库
目前MySQL被广泛地应用在Internet上的中小型网站中由于其体积小、速度快、总体拥有成本低,尤其是开放源开源数据库MySQLMySQL是一个开放源码的小型关联式数据库管理系统,开发者为瑞典MySQLAB公司目前MySQL被广泛地应用在Internet上的中小型网站中由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库盘点:开源社区那些免费的数据库软件MySQL为多种编程语言提供了API,包括C、C、C#、Delphi、Eiffel、Java、Perl、PHP、Python、Ruby和Tcl等而其自身是采用C和C编写的,使用了多种编译器进行测试,所以,MySQL能够保证源代码具有很强的可移植性这样的一款数据库,自然能够支持几乎所有的操作系统,从Unix、Linux到Windows,具体包括AIX、BSDi、FreeBSD、HP-UX、Linux、MacOS、、NetBSD、OpenBSD、OS/2Wrap、Solaris、SunOS、Windows等多种操作系统最重要的是,它是一个可以处理拥有上千万条记录的大型数据库与此同时,MySQL也产生了很多分支版本的数据库也非常值得推荐首先是MariaDB,它是一个采用Maria存储引擎的MySQL分支版本,是由原来MySQL的作者创的公司所开发的免费开源的数据库服务器与MySQL相比较,MariaDB更强的地方在于它拥有的引擎,包括Maria存储引擎、PBXT存储引擎、XtraDB存储引擎、FederatedX存储引擎,它能够更快的复制查询处理、运行的速度更快、更好的功能测试以及支持对Unicode的排序等其次是rcona,它为MySQL数据库服务器进行了改进,在功能和性能上较MySQL有着很显著的提升该版本提升了在高负载情况下的InnoDB的性能,同时,它还为DBA提供一些非常有用的性能诊断工具,并且提供很多参数和命令来控制服务器行为第三是,它使用了诸如google-mysql-tools、和OpenQuery对MySQL进行改造并且,它只包含MySQL的服务器版,并没有提供相应对MySQL的Connector和GUI工具进行改进非关系型数据库NoSQL从NoSQL的字面上理解,NoSQL就是NotOnlySQL,被业界认为是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨NoSQL的拥护者们提倡运用非关系型的数据存储,相对于目前铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入盘点:开源社区那些免费的数据库软件当然,NoSQL也是随着互联网Web20网站的兴起才能取得长足的进步关键的需求在于,传统的关系数据库在应付Web20网站,特别是超大规模和高并发的SNS类型的web20纯动态网站显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展首先推荐的是,这是一个社区版Oracle的这个,是在10月4号的甲骨文全球大全上发布的的其中一个组件,是一个集成了Hadoop、、Oracle数据库Hadoop适配器、Oracle数据库Hadoop装载器及R语言的系统其次推荐的是MembaseMembase是NoSQL家族的一个新的重量级的成员Membase是开源项目,源代码采用了Apache20的使用许可该项目托管在GitHub上,目前可以下载beta版本的Linux二进制包该产品主要是由NorthScale的memcached核心团队成员开发完成,其中还包括Zynga和NHN这两个主要贡献者的工程师,这两个组织都是很大的在线游戏和社区网络空间的供应商并且,Membase容易安装、操作,可以从单节点方便的扩展到集群,而且为memcached(有线协议的兼容性)实现了即插即用功能,在应用方面为开发者和经营者提供了一个比较低的门槛做为缓存解决方案,Memcached已经在不同类型的领域(特别是大容量的Web应用)有了广泛的使用,其中Memcached的部分基础代码被直接应用到了Membase服务器的前端通过兼容多种编程语言和框架,Membase具备了很好的复用性在安装和配置方面,Membase提供了有效的图形化界面和编程接口,包括可配置的告警信息Membase的目标是提供对外的线性扩展能力,包括为了增加集群容量,可以针对统一的节点进行复制另外,对存储的数据进行再分配仍然是必要的第三推荐的是HibariHibari在日语中意思为“云雀”,它是一个专为高可靠性和大数据存储的数据库引擎,可用于云计算环境中,例如webmail、SNS和其他要求T/P级数据存储的环境中同时,Hibari也支持Java,C/C,Python,Ruby和Erlang语言的客户端第四推荐的是memcachedb这是一个由新浪网的开发人员开放出来的开源项目,给memcached分布式缓存服务器添加了BerkeleyDB的持久化存储机制和异步主辅复制机制,让memcached具备了事务恢复能力、持久化能力和分布式复制能力,非常适合于需要超高性能读写速度,但是不需要严格事务约束,能够被持久化保存的应用场景,例如memcachedb被应用在新浪博客上面第五推荐的是Leveldb这是一个Google实现的非常高效的kv数据库,目前的版本12能够支持billion级别的数据量了在这个数量级别下还有着非常高的性能,主要归功于它的良好的设计,特别是LSM算法LevelDB是单进程的服务,性能非常之高,在一台4个Q6600的CPU机器上,每秒钟写数据超过40w,而随机读的性能每秒钟超过10wXML数据库的优势XML数据库是一种支持对XML格式文档进行存储和查询等操作的数据管理系统在系统中,开发人员可以对数据库中的XML文档进行查询、导出和指定格式的序列化目前XML数据库有三种类型:(XEDB),即能处理XML的数据库;(NXD),即纯XML数据库;(HXD),即混合XML数据库关系数据库中的第一代XML支持是切分(或分解)文档,以适应关系表格或将文档原封不动地存储为字符或二进制大对象(CLOB或BLOB)这两个方法中的任一种都尝试将XML模型强制转换成关系模型然而,这两种方法在功能和性能上都有很大的局限性混合型模型将XML存储在类似于DOM的模型中XML数据被格式化为缓冲数据页,以便快速导航和执行查询以及简化索引编制在这里,首要要推荐的XML数据库是Sedna它号称是一款原生态的XML数据库,提供了全功能的核心数据库服务,包括持久化存储、ACID事务、索引、安全、热备、UTF8等实现了W3CXQuery规范,支持全文搜索以及节点级别的更新操作第二款XML数据库是BaseX这款数据库用来存储紧缩的XML数据,提供了高效的XPath和XQuery的实现,同时,它还提供一个前端操作界面盘点:开源社区那些免费的数据库软件第三款推荐的是XMLDB这款数据库使用了关系型数据库来存储任意的XML文档,因为所采用的存储机制,所以文档的搜索速度特别快,同时执行XSL转换也相当快XMLDB同时还提供了一个PHP的模块,可以应用在Web应用中第四块推荐的是X-Hive/DB它是一个为需要高级XML数据处理和存储功能的软件开发者设计的强大的专属XML数据库X-Hive/DBJavaAPI包含存储、查询、检索、转换和发表XML数据的方法与传统关系型数据库相比,XML数据库具有以下优势:第一,XML数据库能够对半结构化数据进行有效的存取和管理如网页内容就是一种半结构化数据,而传统的关系数据库对于类似网页内容这类半结构化数据无法进行有效的管理第二,提供对标签和路径的操作传统数据库语言允许对数据元素的值进行操作,不能对元素名称操作,半结构化数据库提供了对标签名称的操作,还包括了对路径的操作第三,当数据本身具有层次特征时,由于XML数据格式能够清晰表达数据的层次特征,因此XML数据库便于对层次化的数据进行操作XML数据库适合管理复杂数据结构的数据集,如果己经以XML格式存储信息,则XML数据库利于文档存储和检索;可以用方便实用的方式检索文档,并能够提供高质量的全文搜索引擎另外XML数据库能够存储和查询异种的文档结构,提供对异种信息存取的支持2023-07-03 16:18:281
分布式系统领域有哪些经典论文
分布式领域论文译序sql&nosql年代记SMAQ:海量数据的存储计算和查询一.google论文系列1. google系列论文译序2. The anatomy of a large-scale hypertextual Web search engine (译 zz)3. web search for a planet :the google cluster architecture(译)4. GFS:google文件系统 (译)5. MapReduce: Simplied Data Processing on Large Clusters (译)6. Bigtable: A Distributed Storage System for Structured Data (译)7. Chubby: The Chubby lock service for loosely-coupled distributed systems (译)8. Sawzall:Interpreting the Data--Parallel Analysis with Sawzall (译 zz)9. Pregel: A System for Large-Scale Graph Processing (译)10. Dremel: Interactive Analysis of WebScale Datasets(译zz)11. Percolator: Large-scale Incremental Processing Using Distributed Transactions and Notifications(译zz)12. MegaStore: Providing Scalable, Highly Available Storage for Interactive Services(译zz)13. Case Study GFS: Evolution on Fast-forward (译)14. Google File System II: Dawn of the Multiplying Master Nodes15. Tenzing - A SQL Implementation on the MapReduce Framework (译)16. F1-The Fault-Tolerant Distributed RDBMS Supporting Google"s Ad Business17. Elmo: Building a Globally Distributed, Highly Available Database18. PowerDrill:Processing a Trillion Cells per Mouse Click19. Google-Wide Profiling:A Continuous Profiling Infrastructure for Data Centers20. Spanner: Google"s Globally-Distributed Database(译zz)21. Dapper, a Large-Scale Distributed Systems Tracing Infrastructure(笔记)22. Omega: flexible, scalable schedulers for large compute clusters23. CPI2: CPU performance isolation for shared compute clusters24. Photon: Fault-tolerant and Scalable Joining of Continuous Data Streams(译)25. F1: A Distributed SQL Database That Scales26. MillWheel: Fault-Tolerant Stream Processing at Internet Scale(译)27. B4: Experience with a Globally-Deployed Software Defined WAN28. The Datacenter as a Computer29. Google brain-Building High-level Features Using Large Scale Unsupervised Learning30. Mesa: Geo-Replicated, Near Real-Time, Scalable Data Warehousing(译zz)31. Large-scale cluster management at Google with Borg google系列论文翻译集(合集)二.分布式理论系列00. Appraising Two Decades of Distributed Computing Theory Research 0. 分布式理论系列译序1. A brief history of Consensus_ 2PC and Transaction Commit (译)2. 拜占庭将军问题 (译) --Leslie Lamport3. Impossibility of distributed consensus with one faulty process (译)4. Leases:租约机制 (译)5. Time Clocks and the Ordering of Events in a Distributed System(译) --Leslie Lamport6. 关于Paxos的历史7. The Part Time Parliament (译 zz) --Leslie Lamport 8. How to Build a Highly Available System Using Consensus(译)9. Paxos Made Simple (译) --Leslie Lamport10. Paxos Made Live - An Engineering Perspective(译) 11. 2 Phase Commit(译) 12. Consensus on Transaction Commit(译) --Jim Gray & Leslie Lamport 13. Why Do Computers Stop and What Can Be Done About It?(译) --Jim Gray 14. On Designing and Deploying Internet-Scale Services(译) --James Hamilton 15. Single-Message Communication(译)16. Implementing fault-tolerant services using the state machine approach 17. Problems, Unsolved Problems and Problems in Concurrency 18. Hints for Computer System Design 19. Self-stabilizing systems in spite of distributed control 20. Wait-Free Synchronization 21. White Paper Introduction to IEEE 1588 & Transparent Clocks 22. Unreliable Failure Detectors for Reliable Distributed Systems 23. Life beyond Distributed Transactions:an Apostate"s Opinion(译zz) 24. Distributed Snapshots: Determining Global States of a Distributed System --Leslie Lamport 25. Virtual Time and Global States of Distributed Systems 26. Timestamps in Message-Passing Systems That Preserve the Partial Ordering 27. Fundamentals of Distributed Computing:A Practical Tour of Vector Clock Systems 28. Knowledge and Common Knowledge in a Distributed Environment 29. Understanding Failures in Petascale Computers 30. Why Do Internet services fail, and What Can Be Done About It? 31. End-To-End Arguments in System Design 32. Rethinking the Design of the Internet: The End-to-End Arguments vs. the Brave New World 33. The Design Philosophy of the DARPA Internet Protocols(译zz) 34. Uniform consensus is harder than consensus 35. Paxos made code - Implementing a high throughput Atomic Broadcast 36. RAFT:In Search of an Understandable Consensus Algorithm分布式理论系列论文翻译集(合集)三.数据库理论系列0. A Relational Model of Data for Large Shared Data Banks --E.F.Codd 19701. SEQUEL:A Structured English Query Language 19742. Implentation of a Structured English Query Language 19753. A System R: Relational Approach to Database Management 19764. Granularity of Locks and Degrees of Consistency in a Shared DataBase --Jim Gray 19765. Access Path Selection in a RDBMS 1979 6. The Transaction Concept:Virtues and Limitations --Jim Gray7. 2pc-2阶段提交:Notes on Data Base Operating Systems --Jim Gray8. 3pc-3阶段提交:NONBLOCKING COMMIT PROTOCOLS9. MVCC:Multiversion Concurrency Control-Theory and Algorithms --1983 10. ARIES: A Transaction Recovery Method Supporting Fine-Granularity Locking and Partial Rollbacks Using Write-Ahead Logging-199211. A Comparison of the Byzantine Agreement Problem and the Transaction Commit Problem --Jim Gray 12. A Formal Model of Crash Recovery in a Distributed System - Skeen, D. Stonebraker13. What Goes Around Comes Around - Michael Stonebraker, Joseph M. Hellerstein 14. Anatomy of a Database System -Joseph M. Hellerstein, Michael Stonebraker 15. Architecture of a Database System(译zz) -Joseph M. Hellerstein, Michael Stonebraker, James Hamilton四.大规模存储与计算(NoSql理论系列)0. Towards Robust Distributed Systems:Brewer"s 2000 PODC key notes1. CAP理论2. Harvest, Yield, and Scalable Tolerant Systems3. 关于CAP 4. BASE模型:BASE an Acid Alternative5. 最终一致性6. 可扩展性设计模式7. 可伸缩性原则8. NoSql生态系统9. scalability-availability-stability-patterns10. The 5 Minute Rule and the 5 Byte Rule (译) 11. The Five-Minute Rule Ten Years Later and Other Computer Storage Rules of Thumb12. The Five-Minute Rule 20 Years Later(and How Flash Memory Changes the Rules)13. 关于MapReduce的争论14. MapReduce:一个巨大的倒退15. MapReduce:一个巨大的倒退(II)16. MapReduce和并行数据库,朋友还是敌人?(zz)17. MapReduce and Parallel DBMSs-Friends or Foes (译)18. MapReduce:A Flexible Data Processing Tool (译)19. A Comparision of Approaches to Large-Scale Data Analysis (译)20. MapReduce Hold不住?(zz) 21. Beyond MapReduce:图计算概览22. Map-Reduce-Merge: simplified relational data processing on large clusters23. MapReduce Online24. Graph Twiddling in a MapReduce World25. Spark: Cluster Computing with Working Sets26. Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing27. Big Data Lambda Architecture28. The 8 Requirements of Real-Time Stream Processing29. The Log: What every software engineer should know about real-time data"s unifying abstraction30. Lessons from Giant-Scale Services五.基本算法和数据结构1. 大数据量,海量数据处理方法总结2. 大数据量,海量数据处理方法总结(续)3. Consistent Hashing And Random Trees4. Merkle Trees5. Scalable Bloom Filters6. Introduction to Distributed Hash Tables7. B-Trees and Relational Database Systems8. The log-structured merge-tree (译)9. lock free data structure10. Data Structures for Spatial Database11. Gossip12. lock free algorithm13. The Graph Traversal Pattern六.基本系统和实践经验1. MySQL索引背后的数据结构及算法原理2. Dynamo: Amazon"s Highly Available Key-value Store (译zz)3. Cassandra - A Decentralized Structured Storage System (译zz)4. PNUTS: Yahoo!"s Hosted Data Serving Platform (译zz)5. Yahoo!的分布式数据平台PNUTS简介及感悟(zz)6. LevelDB:一个快速轻量级的key-value存储库(译)7. LevelDB理论基础8. LevelDB:实现(译)9. LevelDB SSTable格式详解10. LevelDB Bloom Filter实现11. Sawzall原理与应用12. Storm原理与实现13. Designs, Lessons and Advice from Building Large Distributed Systems --Jeff Dean14. Challenges in Building Large-Scale Information Retrieval Systems --Jeff Dean15. Experiences with MapReduce, an Abstraction for Large-Scale Computation --Jeff Dean16. Taming Service Variability,Building Worldwide Systems,and Scaling Deep Learning --Jeff Dean17. Large-Scale Data and Computation:Challenges and Opportunitis --Jeff Dean18. Achieving Rapid Response Times in Large Online Services --Jeff Dean19. The Tail at Scale(译) --Jeff Dean & Luiz André Barroso 20. How To Design A Good API and Why it Matters21. Event-Based Systems:Architect"s Dream or Developer"s Nightmare?22. Autopilot: Automatic Data Center Management七.其他辅助系统1. The ganglia distributed monitoring system:design, implementation, and experience2. Chukwa: A large-scale monitoring system3. Scribe : a way to aggregate data and why not, to directly fill the HDFS?4. Benchmarking Cloud Serving Systems with YCSB5. Dynamo Dremel ZooKeeper Hive 简述八. Hadoop相关0. Hadoop Reading List1. The Hadoop Distributed File System(译)2. HDFS scalability:the limits to growth(译)3. Name-node memory size estimates and optimization proposal.4. HBase Architecture(译)5. HFile:A Block-Indexed File Format to Store Sorted Key-Value Pairs6. HFile V27. Hive - A Warehousing Solution Over a Map-Reduce Framework8. Hive – A Petabyte Scale Data Warehouse Using Hadoop转载请注明作者:phylips@bmy 2011-4-302023-07-03 16:18:371
Ubuntu 编译时候出现如下错误怎么办
1. 尝试把out整个删除后重新编译。2. Gcc和G++版本是不是正确的。3. 其它依赖包是否安装。2023-07-03 16:18:443
数据管理员DBA是什么意思?
数据库管理员(Database Administrator,简称DBA),是从事管理和维护数据库管理系统(DBMS)的相关工作人员的统称,属于运维工程师的一个分支,主要负责业务数据库从设计、测试到部署交付的全生命周期管理。DBA的核心目标是保证数据库管理系统的稳定性、安全性、完整性和高性能。在国外,也有公司把DBA称作数据库工程师(Database Engineer),两者的工作内容基本相同,都是保证数据库服务7*24小时的稳定高效运转。扩展资料优秀的DBA不仅关心自己运维的数据库系统的原理和发展,而且紧跟业界数据库前沿技术,并关注数据库领域的顶级会议。其中包括国际著名的数据库三大会议SIGMOD、VLDB、ICDE,还有知名数据库公司Percona主办的Percona Live和Oracle主办的Open World等。从另外一个角度说,DBA工作领域对实践经验和独立工作能力要求较高,没有经过大量的动手实践是很难胜任DBA相关工作的 。正是由于上述原因,其职场现状是DBA职位不易进入,而用人单位很难找到合适的从业人员,人员缺口非常大。参考资料来源:百度百科-数据库管理员2023-07-03 16:19:066
除了mnist,手写字体数据库有哪些
1 cifar10数据库 60000张32*32 彩色图片 共10类 50000张训练 10000张测试 下载cifar10数据库 这是binary格式的,所以我们要把它转换成leveldb格式。 2 在../caffe-windows/examples/cifar10文件夹中有一个 convert_cifar_data.cpp 将他include到MainCaller.cpp中。如下: 编译....我是一次就通过了 ,在bin文件夹里出现convert_cifar_data.exe。然后 就可以进行格式转换。binary→leveldb 可以在bin文件夹下新建一个input文件夹。将cifar10.binary文件放在input文件夹中,这样转换时就不用写路径了。 cmd进入bin文件夹 执行后,在output文件夹下有cifar_train_leveldb和cifar_test_leveldb两个文件夹。里面是转化好的leveldb格式数据。 当然,也可以写一个bat文件处理,方便以后再次使用。 3 下面我们要求数据图像的均值 编译../../tools/comput_image_mean.cpp 编译成功后。接下来求mean cmd进入bin。 执行后,在bin文件夹下出现一个mean.binaryproto文件,这就是所需的均值文件。 4 训练cifar网络 在.../examples/cifar10文件夹里已经有网络的配置文件,我们只需要将cifar_train_leveldb和cifar_test_leveldb两个文件夹还有mean.binaryproto文件拷到cifar0文件夹下。 修改cifar10_quick_train.prototxt中的source: "cifar-train-leveldb" mean_file: "mean.binaryproto" 和cifar10_quick_test.prototxt中的source: "cifar-test-leveldb" mean_file: "mean.binaryproto"就可以了, 后面再训练就类似于MNIST的训练。写一个train_quick.bat,内容如下: [plain] view plaincopy copy ..\..\bin\MainCaller.exe ..\..\bin\train_net.exe SET GLOG_logtostderr=1 "../../bin/train_net.exe" cifar10_quick_solver.prototxt pause2023-07-03 16:19:351
什么是数据库,该怎么建立属于自己的数据库?
数据库,港台叫资料库(Data base),简单来说可视为电子化的档案柜——储存电子档案的处所,使用者可以对档案中的资料执行新增、撷取、更新、删除等操作。资料库指的是以一定方式储存在一起、能为多个用户共享、具有尽可能小的冗馀度、与应用程式彼此独立的资料集合。数据库指的是以一定方式储存在一起、能为多个用户共享、具有尽可能小的冗馀度、与应用程式彼此独立的资料集合。数据库一般具有储存、撷取、安全保障、备份等基础功能。资料库管理系统可以依据它所支援的资料库模型来作分类,例如关联式、XML;或依据所支援的电脑类型来作分类,例如伺服器群集、行动电话;或依据所用查询语言来作分类,例如SQL、XQuery;或依据效能冲量重点来作分类,例如最大规模、最高执行速度;亦或其他的分类方式。不论使用哪种分类方式,一些DBMS能够跨类别,例如,同时支援多种查询语言。数据库类型关联式资料库MySQLMariaDB(MySQL的代替品)Percona Server(MySQL的代替品)PostgreSQLMicrosoft AccessMicrosoft SQL ServerGoogle Fusion TablesFileMakerOracle资料库SybasedBASEClipperFoxProfoshub几乎所有的资料库管理系统都配备了一个开放式资料库连接(ODBC)驱动程式,令各个资料库之间得以互相整合。非关系型资料库(NoSQL)BigTable(Google)CassandraMongoDBCouchDB键值(key-value)资料库Apache CassandraDynamoLevelDB2023-07-03 16:19:4510
分布式数据库和nosql区别吗
互联网公司常用的基本集中在以下几种,每种只举一个比较常见或者应用比较成功的例子吧。1. In-Memory KV Store : Redisin memory key-value store,同时提供了更加丰富的数据结构和运算的能力,成功用法是替代memcached,通过checkpoint和commit log提供了快速的宕机恢复,同时支持replication提供读可扩展和高可用。2. Disk-Based KV Store: Leveldb真正基于磁盘的key-value storage, 模型单一简单,数据量不受限于内存大小,数据落盘高可靠,Google的几位大神出品的精品,LSM模型天然写优化,顺序写盘的方式对于新硬件ssd再适合不过了,不足是仅提供了一个库,需要自己封装server端。3. Document Store: Mongodb分布式nosql,具备了区别mysql的最大亮点:可扩展性。mongodb 最新引人的莫过于提供了sql接口,是目前nosql里最像mysql的,只是没有ACID的特性,发展很快,支持了索引等特性,上手容易,对于数据量远超内存限制的场景来说,还需要慎重。4. Column Table Store: HBase这个富二代似乎不用赘述了,最大的优势是开源,对于普通的scan和基于行的get等基本查询,性能完全不是问题,只是只提供裸的api,易用性上是短板,可扩展性方面是最强的,其次坐上了Hadoop的快车,社区发展很快,各种基于其上的开源产品不少,来解决诸如join、聚集运算等复杂查询。2023-07-03 16:20:141
什么是数据库管理系统?
数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称DBMS。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。用户通过DBMS访问数据库中的数据,数据库管理员也通过dbms进行数据库的维护工作。它可使多个应用程序和用户用不同的方法在同时或不同时刻去建立,修改和询问数据库。大部分DBMS提供数据定义语言DDL(Data Definition Language)和数据操作语言DML(Data Manipulation Language),供用户定义数据库的模式结构与权限约束,实现对数据的追加、删除等操作。数据库管理系统是数据库系统的核心,是管理数据库的软件。数据库管理系统就是实现把用户意义下抽象的逻辑数据处理,转换成为计算机中具体的物理数据处理的软件。有了数据库管理系统,用户就可以在抽象意义下处理数据,而不必顾及这些数据在计算机中的布局和物理位置。1.数据定义:DBMS提供数据定义语言DDL(Data Definition Language),供用户定义数据库的三级模式结构、两级映像以及完整性约束和保密限制等约束。DDL主要用于建立、修改数据库的库结构。DDL所描述的库结构仅仅给出了数据库的框架,数据库的框架信息被存放在数据字典(Data Dictionary)中。2.数据操作:DBMS提供数据操作语言DML(Data Manipulation Language),供用户实现对数据的追加、删除、更新、查询等操作。3.数据库的运行管理:数据库的运行管理功能是DBMS的运行控制、管理功能,包括多用户环境下的并发控制、安全性检查和存取限制控制、完整性检查和执行、运行日志的组织管理、事务的管理和自动恢复,即保证事务的原子性。这些功能保证了数据库系统的正常运行。4.数据组织、存储与管理:DBMS要分类组织、存储和管理各种数据,包括数据字典、用户数据、存取路径等,需确定以何种文件结构和存取方式在存储级上组织这些数据,如何实现数据之间的联系。数据组织和存储的基本目标是提高存储空间利用率,选择合适的存取方法提高存取效率。5.数据库的保护:数据库中的数据是信息社会的战略资源,所以数据的保护至关重要。DBMS对数据库的保护通过4个方面来实现:数据库的恢复、数据库的并发控制、数据库的完整性控制、数据库安全性控制。DBMS的其他保护功能还有系统缓冲区的管理以及数据存储的某些自适应调节机制等。6.数据库的维护:这一部分包括数据库的数据载入、转换、转储、数据库的重组合重构以及性能监控等功能,这些功能分别由各个使用程序来完成。7.通信:DBMS具有与操作系统的联机处理、分时系统及远程作业输入的相关接口,负责处理数据的传送。对网络环境下的数据库系统,还应该包括DBMS与网络中其他软件系统的通信功能以及数据库之间的互操作功能。2023-07-03 16:20:259
以太坊架构是怎么样的?
以太坊是一个平台,它上面提供各种模块让用户来搭建应用,如果将搭建应用比作造房子,那么以太坊就提供了墙面、屋顶、地板等模块,用户只需像搭积木一样把房子搭起来,因此在以太坊上建立应用的成本和速度都大大改善。具体来说,以太坊通过一套图灵完备的脚本语言(EthereumVirtual Machinecode,简称EVM语言)来建立应用,它类似于汇编语言,我们知道,直接用汇编语言编程是非常痛苦的,但以太坊里的编程并不需要直接使用EVM语言,而是类似C语言、Python、Lisp等高级语言,再通过编译器转成EVM语言很高兴能为你提供帮助2023-07-03 16:22:2014