首页 文章 精选 留言 我的

精选列表

搜索[MiMo模型],共10000篇文章
优秀的个人博客,低调大师

一文读懂目标检测模型(附论文资源)

1. R-CNN R-CNN是2014年出现的。它是将CNN用于对象检测的起源,能够基于丰富的特征层次结构进行目标精确检测和语义分割来源。 如何确定这些边界框的大小和位置呢?R-CNN网络是这样做的:在图像中提出了多个边框,并判断其中的任何一个是否对应着一个具体对象。 要想进一步了解,可以查看以下PPT和笔记: http://www.image-net.org/challenges/LSVRC/2013/slides/r-cnn-ilsvrc2013-workshop.pdf http://www.cs.berkeley.edu/~rbg/slides/rcnn-cvpr14-slides.pdf http://zhangliliang.com/2014/07/23/paper-note-rcnn/ 2. Fast R-CNN 2015年,R-C

优秀的个人博客,低调大师

cassandra框架模型之二——存储机制 CommitLog MemTable SSTable

四、副本存储 Cassandra不像HBase是基于HDFS的分布式存储,它的数据是存在每个节点的本地文件系统中。 Cassandra有三种副本配置策略: 1)SimpleStrategy(RackUnawareStrategy): 副本不考虑机架的因素,按照Token放置在连续下几个节点。如图3所示,假如副本数为3,属于A节点的数据在B.C两个节点中也放置副本。 2)OldNetworkTopologyStrategy(RackAwareStrategy): 考虑机架的因素,除了基本的数据外,先找一个处于不同数据中心的点放置一个副本,其余N-2个副本放置在同一数据中心的不同机架中。 3)NetworkTopologyStrategy(DatacenterShardStrategy): 将M个副本放置到其他的数据中心,将N-M-1的副本放置在同一数据中心的不同机架中。 五、网络嗅探 网络嗅探主要用来计算不同host的相对距离,进而告诉Cassandra网络拓扑结构,以便更高效地对用户请求进行路由。主要有三种配置策略: 1)org.apache.cassandra.locator.SimpleSnitch: 将不同host逻辑上的距离(Cassandra Ring)作为他们之间的相对距离。 2)org.apache.cassandra.locator.RackInferringSnitch: 相对距离是由rack和data center决定的,分别对应ip的第3和第2个八位组。即,如果两个节点的ip的前3个八位组相同,则认为它们在同一个rack(同一个rack中不同节点,距离相同);如果两个节点的ip的前两个八位组相同,则认为它们在同一个数据中心(同一个data center中不同节点,距离相同)。 3)org.apache.cassandra.locator.PropertyFileSnitch: 相对距离是由rack和data center决定的,且它们是在配置文件cassandra-topology.properties中设置的。 六、一致性 在一致性上,Cassandra采用了最终一致性,可以根据具体情况来选择一个最佳的折衷,来满足特定操作的需求。Cassandra可以让用户指定读/插入/删除操作的一致性级别,一致性级别有多种,如图5所示。 图5Cassandra一致性级别 注:一致性级别是由副本数决定,而不是集群的节点数目决定。 Quorum NRW协议中,只需W + R > N,就可以保证强一致性。一般来说,Quorum中比较典型的NRW为(3,2,2)。 维护最终一致性 Cassandra通过4个技术来维护数据的最终一致性,分别为逆熵(Anti-Entropy),读修复(Read Repair),提示移交(Hinted Handoff)和分布式删除。 1)逆熵 这是一种备份之间的同步机制。节点之间定期互相检查数据对象的一致性,这里采用的检查不一致的方法是Merkle Tree; 2)读修复 客户端读取某个对象的时候,触发对该对象的一致性检查: 读取Key A的数据时,系统会读取Key A的所有数据副本,如果发现有不一致,则进行一致性修复。 如果读一致性要求为ONE,会立即返回离客户端最近的一份数据副本。然后会在后台执行Read Repair。这意味着第一次读取到的数据可能不是最新的数据;如果读一致性要求为QUORUM,则会在读取超过半数的一致性的副本后返回一份副本给客户端,剩余节点的一致性检查和修复则在后台执行;如果读一致性要求高(ALL),则只有Read Repair完成后才能返回一致性的一份数据副本给客户端。可见,该机制有利于减少最终一致的时间窗口。 3)提示移交 对写操作,如果其中一个目标节点不在线,先将该对象中继到另一个节点上,中继节点等目标节点上线再把对象给它: Key A按照规则首要写入节点为N1,然后复制到N2。假如N1宕机,如果写入N2能满足ConsistencyLevel要求,则Key A对应的RowMutation将封装一个带hint信息的头部(包含了目标为N1的信息),然后随机写入一个节点N3,此副本不可读。同时正常复制一份数据到N2,此副本可以提供读。如果写N2不满足写一致性要求,则写会失败。等到N1恢复后,原本应该写入N1的带hint头的信息将重新写回N1。 4)分布式删除 单机删除非常简单,只需要把数据直接从磁盘上去掉即可,而对于分布式,则不同,分布式删除的难点在于:如果某对象的一个备份节点A当前不在线,而其他备份节点删除了该对象,那么等A再次上线时,它并不知道该数据已被删除,所以会尝试恢复其他备份节点上的这个对象,这使得删除操作无效。Cassandra的解决方案是:本地并不立即删除一个数据对象,而是给该对象标记一个hint,定期对标记了hint的对象进行垃圾回收。在垃圾回收之前,hint一直存在,这使得其他节点可以有机会由其他几个一致性保证机制得到这个hint。Cassandra通过将删除操作转化为一个插入操作,巧妙地解决了这个问题。 七、存储机制 Cassandra的存储机制借鉴了Bigtable的设计,采用Memtable和SSTable的方式。 CommitLog 和HBase一样,Cassandra在写数据之前,也需要先记录日志,称之为Commit Log,然后数据才会写入到Column Family对应的MemTable中,且MemTable中的数据是按照key排序好的。SSTable一旦完成写入,就不可变更,只能读取。下一次Memtable需要刷新到一个新的SSTable文件中。所以对于Cassandra来说,可以认为只有顺序写,没有随机写操作。 MenTable MemTable是一种内存结构,当数据量达到块大小时,将批量flush到磁盘上,存储为SSTable。这种机制,相当于缓存写回机制(Write-back Cache),优势在于将随机IO写变成顺序IO写,降低大量的写操作对于存储系统的压力。所以我们可以认为Cassandra中只有顺序写操作,没有随机写操作。 SSTable SSTable是Read Only的,且一般情况下,一个CF会对应多个SSTable,当用户检索数据时,Cassandra使用了Bloom Filter,即通过多个hash函数将key映射到一个位图中,来快速判断这个key属于哪个SSTable。 为了减少大量SSTable带来的开销,Cassandra会定期进行compaction,简单的说,compaction就是将同一个CF的多个SSTable合并成一个SSTable。在Cassandra中,compaction主要完成的任务是: 1)垃圾回收:cassandra并不直接删除数据,因此磁盘空间会消耗得越来越多,compaction会把标记为删除的数据真正删除; 2)合并SSTable:compaction将多个SSTable合并为一个(合并的文件包括索引文件,数据文件,bloom filter文件),以提高读操作的效率; 3)生成MerkleTree:在合并的过程中会生成关于这个CF中数据的MerkleTree,用于与其他存储节点对比以及修复数据。 详细存储数据结构参考http://www.ibm.com/developerworks/cn/opensource/os-cn-cassandraxu2 Cassandra和HBase的一个重要区别是,Cassandra在每个节点是是一个单Java进程,而完整的HBase解决方案却由不同部分组成:有数据库进程本身,它可能会运行在多个模式;一个配置好的hadoop HDFS分布式文件系统,以及一个Zookeeper系统来协调不同的HBase进程。 本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/bonelee/p/6278154.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android应用程序线程消息循环模型分析(5)

从AsyncTask的实现可以看出,当我们第一次创建一个AsyncTask对象时,首先会执行下面静态初始化代码创建一个线程池sExecutor: privatestaticfinalBlockingQueue<Runnable>sWorkQueue= newLinkedBlockingQueue<Runnable>(10); privatestaticfinalThreadFactorysThreadFactory=newThreadFactory(){ privatefinalAtomicIntegermCount=newAtomicInteger(1); publicThreadnewThread(Runnabler){ returnnewThread(r,"AsyncTask#"+mCount.getAndIncrement()); } }; ...... privatestaticfinalThreadPoolExecutorsExecutor=newThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE,KEEP_ALIVE,TimeUnit.SECONDS,sWorkQueue,sThreadFactory); 这里的ThreadPoolExecutor是Java提供的多线程机制之一,这里用的构造函数原型为: ThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,longkeepAliveTime,TimeUnitunit, BlockingQueue<Runnable>workQueue,ThreadFactorythreadFactory) 各个参数的意义如下: corePoolSize -- 线程池的核心线程数量 maximumPoolSize -- 线程池的最大线程数量 keepAliveTime -- 若线程池的线程数数量大于核心线程数量,那么空闲时间超过keepAliveTime的线程将被回收 unit -- 参数keepAliveTime使用的时间单位 workerQueue -- 工作任务队列 threadFactory -- 用来创建线程池中的线程 简单来说,ThreadPoolExecutor的运行机制是这样的:每一个工作任务用一个Runnable对象来表示,当我们要把一个工作任务交给这个线程池来执行的时候,就通过调用ThreadPoolExecutor的execute函数来把这个工作任务加入到线程池中去。此时,如果线程池中的线程数量小于corePoolSize,那么就会调用threadFactory接口来创建一个新的线程并且加入到线程池中去,再执行这个工作任务;如果线程池中的线程数量等于corePoolSize,但是工作任务队列workerQueue未满,则把这个工作任务加入到工作任务队列中去等待执行;如果线程池中的线程数量大于corePoolSize,但是小于maximumPoolSize,并且工作任务队列workerQueue已经满了,那么就会调用threadFactory接口来创建一个新的线程并且加入到线程池中去,再执行这个工作任务;如果线程池中的线程量已经等于maximumPoolSize了,并且工作任务队列workerQueue也已经满了,这个工作任务就被拒绝执行了。 创建好了线程池后,再创建一个消息处理器: privatestaticfinalInternalHandlersHandler=newInternalHandler(); 注意,这行代码是在应用程序的主线程中执行的,因此,这个消息处理器sHandler内部引用的消息循环对象looper是应用程序主线程的消息循环对象,消息处理器的实现机制具体可以参考前面一篇文章 Android应用程序消息处理机制(Looper、Handler)分析 。 AsyncTask类的静态初始化代码执行完成之后,才开始创建AsyncTask对象,即执行AsyncTask类的构造函数: publicAsyncTask(){ mWorker=newWorkerRunnable<Params,Result>(){ publicResultcall()throwsException{ ...... returndoInBackground(mParams); } }; mFuture=newFutureTask<Result>(mWorker){ @Override protectedvoiddone(){ Messagemessage; Resultresult=null; try{ result=get(); }catch(InterruptedExceptione){ android.util.Log.w(LOG_TAG,e); }catch(ExecutionExceptione){ thrownewRuntimeException("AnerroroccuredwhileexecutingdoInBackground()", e.getCause()); }catch(CancellationExceptione){ message=sHandler.obtainMessage(MESSAGE_POST_CANCEL, newAsyncTaskResult<Result>(AsyncTask.this,(Result[])null)); message.sendToTarget(); return; }catch(Throwablet){ thrownewRuntimeException("Anerroroccuredwhileexecuting" +"doInBackground()",t); } message=sHandler.obtainMessage(MESSAGE_POST_RESULT, newAsyncTaskResult<Result>(AsyncTask.this,result)); message.sendToTarget(); } }; } 在AsyncTask类的构造函数里面,主要是创建了两个对象,分别是一个WorkerRunnable对象mWorker和一个FutureTask对象mFuture。 WorkerRunnable类实现了Runnable接口,此外,它的内部成员变量mParams用于保存从AsyncTask对象的execute函数传进来的参数列表: privatestaticabstractclassWorkerRunnable<Params,Result>implementsCallable<Result>{ Params[]mParams; } FutureTask类也实现了Runnable接口,所以它可以作为一个工作任务通过调用AsyncTask类的execute函数添加到sExecuto线程池中去: publicfinalAsyncTask<Params,Progress,Result>execute(Params...params){ ...... mWorker.mParams=params; sExecutor.execute(mFuture); returnthis; } 这里的FutureTask对象mFuture是用来封装前面的WorkerRunnable对象mWorker。当mFuture加入到线程池中执行时,它调用的是mWorker对象的call函数: mWorker=newWorkerRunnable<Params,Result>(){ publicResultcall()throwsException{ ...... returndoInBackground(mParams); } }; 在call函数里面,会调用AsyncTask类的doInBackground函数来执行真正的任务,这个函数是要由AsyncTask的子类来实现的,注意,这个函数是在应用程序的子线程中执行的,它不可以操作应用程序的界面。 本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/966888,如需转载请自行联系原作者

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册