精华内容
下载资源
问答
  • 在看论文的过程中不断的出现end-to-end train这的词,于是我就很好奇,什么是端对端的训练。从网上的资料整理下来大概是这样的。 网上资料整理 端到端指的是输入是原始数据,输出是最后的结果,原来输入端不是直接...

    在看论文的过程中不断的出现end-to-end train这的词,于是我就很好奇,什么是端对端的训练。从网上的资料整理下来大概是这样的。

    网上资料整理

    1. 端到端指的是输入是原始数据,输出是最后的结果,原来输入端不是直接的原始数据,而是在原始数据中提取的特征,这一点在图像问题上尤为突出,因为图像像素数太多,数据维度高,会产生维度灾难,所以原来一个思路是手工提取图像的一些关键特征,这实际就是就一个降维的过程。
      那么问题来了,特征怎么提?
      特征提取的好坏异常关键,甚至比学习算法还重要,举个例子,对一系列人的数据分类,分类结果是性别,如果你提取的特征是头发的颜色,无论分类算法如何,分类效果都不会好,如果你提取的特征是头发的长短,这个特征就会好很多,但是还是会有错误,如果你提取了一个超强特征,比如染色体的数据,那你的分类基本就不会错了。
      这就意味着,特征需要足够的经验去设计,这在数据量越来越大的情况下也越来越困难。
      于是就出现了端到端网络,特征可以自己去学习,所以特征提取这一步也就融入到算法当中,不需要人来干预了
    2. 经典机器学习方式是以人类的先验知识将raw数据预处理成feature,然后对feature进行分类。分类结果十分取决于feature的好坏。所以过去的机器学习专家将大部分时间花费在设计feature上。那时的机器学习有个更合适的名字叫feature engineering 。后来人们发现,利用神经网络,让网络自己学习如何抓取feature效果更佳。于是兴起了representation learning。这种方式对数据的拟合更加灵活。网络进一步加深,多层次概念的representation learning将识别率达到了另一个新高度。于是你听到了是个搞机器学习的人都知道的名字:deep learning。实指多层次的特征提取器与识别器统一训练和预测的网络。
      end to end的好处:通过缩减人工预处理和后续处理,尽可能使模型从原始输入到最终输出,给模型更多可以根据数据自动调节的空间,增加模型的整体契合度。

    当然还有很多其他的说法,但表达的意思也都大同小异,主要是通过端对端的训练来更准确,快速的确定特征。对于图像处理来说可以有效的降低数据维度,准确的提炼出图像特征。达到不同的目的。

    展开全文
  • tcmalloc是啥子

    2020-02-13 14:53:28
     // Don't try to release num_objects_to_move if we don't have that many.  release min(max_length, num_objects_to_move) objects to central list  if max_length < num_...

    动机

    TCMalloc是一个非常快速的内存管理库,它比glibc 2.3的malloc以及其他的一些内存管理库都要更高效。ptmalloc2在2.8GHz P4机器上执行一次malloc/free(分配释放小的内存块)大约耗时300纳秒。相同的执行操作,TCMalloc的实现只需要大约50纳秒。

    TCMalloc同时也为多线程编程减少了锁的竞争,对于小块内存分配,TCMalloc实际上没有锁开销。对于大块内存,TCMalloc使用非常高效的自旋锁。Ptmalloc2通过给每个线程一个内存池来实现减少锁竞争,但是ptmalloc2在使用每线程一个内存池时存在一个较大的问题。它的各个线程的内存池分配的内存不可以互相移动。这导致巨大的空间浪费

    如何使用

    TCMalloc使用起来非常简单,只要在编译链接程序是添加-ltcmalloc链接选项即可。

    TCMalloc编译后同时生产动态链接库和静态链接库,应用程序默认是链接动态链接库的,个人不喜欢动态链接,我将编译后的动态链接库移到另一个目录,这样应用程序链接时就链接静态库了。

    TCMalloc同时包含了heap checker和heap profiler工具。

    如果应用程序不想包含这两个库,那么只链接-ltcmalloc_minimal即可。

    TCMalloc总览

    TCMalloc的英文全称是:Thead-Caching Malloc。顾名思义,TCMalloc给每个线程都分配一个局部缓存,采用线程局部数据技术。小块内存的分配从线程局部缓存分配即可满足。内存对象根据应用程序需要从中心堆栈移到线程局部缓存中,同时周期性的将线程缓存中过多的内存回收到中心堆栈。

     

    TCMalloc对<=32K的内存与大内存块的处理不同。TCMalloc使用页级别(内存页以4k字节对齐)的内存分配器直接从中心堆分配。即,大块内存对象是页对齐的,通常占用整数倍个页面。

    一系列的内存页可以被分割为很多大小相同的小内存对象,例如,一个4k内存页面可以被分割成32个128字节小内存对象。、

    小内存对象的分配

    每一个小内存对象都可映射在大约60个可分配的固定大小内存对象池中的一个。例如,所有分配833到1024字节大小的内存都将映射到1024。对象池根据大小按照8字节,16字节,32字节,等进行对齐。假设一个应用程序需要分配一个N+1个字节大小的内存对象,而N刚好是一个对齐对象的大小,那么N+1个字节就要被映射到下一个对齐对象N+k,那么k-1个字节就被浪费了。为了防止这种过多的内存被浪费,最大的对齐间隔是被控制的。

    每一个线程局部缓存对保存了每一个空闲对齐对象的单链表,如下图:

     

    小内存对象分配过程:

    1) 将要分配的大小映射到对应的对齐对象。

    2) 在当前线程的局部缓存中查找该对齐对象链表。

    3) 如果该链表不为空,删除链表第一个节点并返回给调用者。

    通过上述快速的过程,TCMalloc没有请求任何锁。无锁机制显著的提高了内存分配速度,因为一对lock、unlock操作在2.8GHz的Xeon上大概会耗时100纳秒。

    如果空闲链表是空的:

    1) 从中心堆链表取出一大串该对齐对象,中心堆栈被所有线程共享。

    2) 把这些对象添加到线程局部缓存的链表中。

    3) 返回一个新取到的对象。

    如果中心堆栈链表也是空的:

    1) 从中心页面分配器中分配一系列页面。

    2) 将这些页分割成该对齐对象的大小。

    3) 将分割后的对齐对象添加到中心堆栈链表。

    4) 如前所述,从中心堆栈的链表移动一些到线程局部缓存链表中去。

    调整线程局部缓存链表的大小

    调整线程局部缓存链表到合适的大小是非常重要的。如果链表太小,那么就需要经常去中心共享的链表中取对象。如果局部缓存的链表太大,又浪费了太多的空闲内存。

     

    需要注意的是线程局部缓存对释放对象也同分配对象一样重要。如果没有线程局部缓存,每一次释放内存对需要将内存对象移动到中心共享链表中去。同时一些线程的分配和释放并不是对称的(例如生产者和消费者线程),因此调整局部缓存链表的到一个合适的大小变得更加的复杂了。

     

    为了合适的调整局部缓存空闲链表的大小,TCMalloc使用了慢速启动算法来决定各个线程的空闲链表最大长度。因为空闲链表被频繁的使用,它的最大长度就增大。然而,如果空闲链表被内存释放使用多于内存分配使用,它的最大长度将只增长到一个点,在这个点的时候整个链表可以高效的被一次移动到中心共享链表中去。

     

    下面这段伪代码将说明慢速启动算法。需要注意的是num_objects_to_move针对每一种对齐的内存对象。通过使用共识的长度移动空闲链表,中心共享缓存可以高效在这些线程缓存直接传递链表。如果一个线程缓存想要获得比num_objects_to_move少的内存快个数,中心缓存上的操作只有线性复杂度。经常使用 num_objects_to_move作为中心缓存链表传入或传出对象的个数在这些并不需要这么多内存的线程中就会浪费内存。

    Start each freelist max_length at 1.

    Allocation

      if freelist empty {

        fetch min(max_length, num_objects_to_move) from central list;

        if max_length < num_objects_to_move {  // slow-start

          max_length++;

        } else {

          max_length += num_objects_to_move;

        }

      }

    Deallocation

      if length > max_length {

        // Don't try to release num_objects_to_move if we don't have that many.

        release min(max_length, num_objects_to_move) objects to central list

        if max_length < num_objects_to_move {

          // Slow-start up to num_objects_to_move.

          max_length++;

        } else if max_length > num_objects_to_move {

          // If we consistently go over max_length, shrink max_length.

          overages++;

          if overages > kMaxOverages {

            max_length -= num_objects_to_move;

            overages = 0;

          }

        }

      }

     

    参加垃圾回收章节描述它如何影响max_length。

    大内存对象的分配

    大对象(>32K)的大小被规整到页面(4K)对齐并且被一个中心页面堆所处理。中心页面堆是一个空闲列表数组。对于i<256,第k项就是一个由包含K个页面的系列组成的空闲链表。第256项是由包含超过256个页面系列组成的空闲列表。

     

    分配k个页面只需要在第k个空闲链表中查找即可满足。如果该链表为空,再下一个链表中查找,以此类推。如果前面都查找失败,那么就最后的链表中查找。如果依然失败,我们就从系统中获取内存(使用sbrk, mmap, 或者映射部分/dev/mem)

    如果从长度大于k个连续页面中分配k个页面,那么剩余的系列页面将被重新插入到中心堆栈中合适的空闲链表中去。

    Spans

    TCMalloc的堆管理是由一系列页面组成。一系列连续的页面被称作为一个Spans对象。一个Spans可以被分配了的也可以是空闲的。如果是空闲的,该Spans是堆栈链表中的某一项。如果是被分配的,它是一个已经被移交给应用程序的大对象,或者是已经被切割成一组小对象的系列页面。如果被分割成小对象,这些小对象的大小会被记录在spans中。

    由页面号索引的中心数组可以被用来查找一个页面所属的spans。例如,span a占据2个页面,span b占据一个页面,span c占据5个页面和span d占据3个页面。

     

    在32位地址空间中,中心数组用一个2层的基数树来表示,树的根节点包含32项,每个叶子节点包含2^15项(一个32位的地址空间包含了2^20 个4k页面,所以这里的树的第一层用2^5整除2^20个页面)。这导致中心数组一开始就要使用128K内存(2^15*4 bytes),这看起来还可以接受。

    在64位机器上就要使用三层的基数树了。

    内存释放

    当一个内存被释放时,我们计算它的页号并在中心数组中查找其对应的Span对象。该Span告诉我们该对象是不是小对象,如果是小对象还告诉我们它的对齐对象的尺寸。如果是小对象,我们就把它插入到当前线程对应的线程局部缓存中去。如果该线程局部缓存现在超过了预设置的大小(默认2MB),我们就执行垃圾回收将不使用的内存从线程局部缓存移到中心堆栈链表中去。

    如果是大对象,span会告诉我们该对象覆盖页面的范围。假设该范围是[p,q]。同时我们也去查找page p-1和page q+1的span。如果这些相邻的span也是空闲的,我们将他们和[p,q] span合并。合并的结果插入到中心堆栈合适的链表中去。

    小对象的中心空闲链表

    如前所述,我们为每一种尺寸的对齐对象保存一个中心空闲链表。每一个中心空闲链表由一个两层的数据结构组成:一个Spans集合,每个span有一个链表。

    从中心空闲链表分配数据时直接返回一些span的链表第一个节点。(如果中心链表的所有spans均为空的,那么就从中心页堆中分配合适大小的span)

    当中心空闲链表回收对象时,把该对象添加到它对应的span的链表中去。如果此刻链表的长度等于span中所有小对象的个数,那么该span就是完全空闲的了,它将被中心页堆回收。

    线程局部缓存的垃圾回收

    从线程局部缓存进行对象的垃圾回收保证了缓存的大小可控并返回这些对象到中心空闲链表。一些线程需要很大的缓存,而另一些线程可能需要很小或者不需要缓存。当一个线程局部缓存的大小超过了它的max_size,垃圾回收开始执行,同时一些线程与另一些线程竞争更大的缓存。

    垃圾回收只发生在内存释放时。我们遍历缓存中的空闲链表,并且移动一些对象到其对应的中心空闲链表。

    从缓存的空闲链表移除的对象个数取决于每个链表的低阈值L。L记录了从上次垃圾回收以来链表最小的长度。需要注意的是,我们可能在上一次垃圾回收中只是把空闲链表缩短了L个对象,而没有对象中心空闲链表进行任何额外的访问。我们使用过去的历史来预测未来的访问,并且将L/2个对象从局部缓存链表移动到其对应的中心空闲链表。该算法有一个非常好的特性,即当某个线程不再使用某一种大小的对齐对象时,该缓存中所有该对象将被迅速的移到中心空闲链表,这样就可以被其他线程所使用。

    如果一个线程连续释放某大小的对齐对象的速度超过该对象分配的速度,这种L/2的行为将导致始终有L/2个对象在空闲链表中。为避免这种内存浪费,我们收缩链表的最大长度向num_objects_to_move集中靠拢。(参靠 调整线程局部缓存链表大小)

    Garbage Collection

      if (L != 0 && max_length > num_objects_to_move) {

        max_length = max(max_length - num_objects_to_move, num_objects_to_move)

      }

    事实上如果线程局部缓存向超过它的max_size就表示该线程将要需要更大的缓存。简单的增加max_size将使拥有大量活动线程的程序过度使用大量的内存。开发者可以使用flag --tcmalloc_max_total_thread_cache_bytes来限制内存。

    每一个线程的起始max_size非常小(64k),因为空闲线程不需要预分配内存,因为他们不需要。每次缓存执行垃圾回收,它就会尝试增大max_size。如果线程缓存中所有对齐对象的大小之和小于tcmalloc_max_total_thread_cache_bytes,max_size增长得很容易。如果不是,线程缓存1将通过减少线程缓存2的max_size来从缓存2偷取(循环获取)。通过这种方法,比较活跃的线程往往比窃取自己内存更加频繁的窃取其他线程的内存。通常空闲的线程止于小缓存,活跃的线程止于大缓存。需要注意的是,这种窃取将导致所有线程的缓存的大小大于--tcmalloc_max_total_thread_cache_bytes 直到线程缓存2释放一些内存来触发垃圾回收。

    展开全文
  • Activity是啥子

    2018-01-04 11:50:52
    an application component that provides a screen with which users can interact in order to do something, such as dial the phone, take a photo, send an email, or view a map. 这句话概括的很好,...

    百度百科:  https://baike.baidu.com/item/activity/7304419?fr=aladdin

    本文我主要通过查看Activity的实现源码和推测其设计思想的方法来探讨一下Android的本质是什么。


    Activity恐怖是Android用得最多且是最基本的组件了,估计也是每个学Android的人接触的第一概念,对于Activity的理解和说法,层出不穷,有人说是一个窗口,有个说是一个活动,但他的本质是什么呢,官方的说法是Activity一个应用程序的组件,它提供一个屏幕来与用户交互,以便做一些诸如打电话、发邮件和看地图之类的事情,原话如下:

    An Activity is an application component that provides a screen with which users can interact in order to do something, such as dial the phone, take a photo, send an email, or view a map.

    这句话概括的很好,但我并不认为这就是Activity的本质。


    切入主题之前,我们先要了解一下UI系统的职责和原理。所有的图形界面,无论是什么UI系统,都要收集用户的活动,这些活动包括打开和关闭程序,输入事件等,这样系统才能针对这些活动做出一些反应,比如程序打开时加载一个数据库,建立一个网络连接,不过针对这些活动所作出的反应都委托给了具体的应用程序,系统相当于只是把这些事件或消息转发给应用程序。下面是一个简单的图:


    这些消息怎么转发给程序呢,可以约定好,要求应程序写一个方法,或如果是C可要求传入一个回调,Java可以要求程序传入一个监听器,总之实现这个功能还是很容易的,但这么多消息,全部传到一个方法里吗,我想那样会很惨,那样可能要求你写应用程序的时候可能要写一个长长的swich语句或if语句,所以一般都把这些消息分类,如一种是整个程序的活动的消息,如关闭和打开,还有就是输入事件,如按键鼠标,每个分类里的消息还可以再细分,这样的话,就可以封装成多个类或接口,每个类有数个方法,之后应用程序重写这些类方法或实现某个接口,系统就可以通过调用这些类或接口的实例发送消息了。

    于是问题转化成了类的设计。在Windows中,有个窗口类来接受一个窗口的活动,系统就可以通过调用窗口类的方法来传递消息,这个窗口类既接受打开和关闭的活动,又接受用户输入事件。而在Android中而不同,Activity只接受打开和关闭等的活动,而不会接受输入事件,那是由Activity内嵌的Window类来接受的,然后转发给相应View,你有可能会说Activity中有个onKeyDown方法,其实那只是处理没人领的按键消息才会到达Activity。现在发现Android和Windows分发消息的的区别了吧,这样化分,每个类的职责更细了,更明确了,当然喽,Android中的消息跟Windows中的可能有点稍小的区别。


    现在应该可以很容易的理确Android的每一个生命周期对应的方法(onCreate, onStart...)其实是处理收到的消息,当用户打开一个Activity的时候,系统(严格的说应该是ActivityManager)就会调用onCreate来告诉你这个消息,这个时候你就要加载你的XML布局文件并做一些初始化。然后离开的时候,就应该把这个Activity销毁吗,如果用户是暂时离开,等下还要回来呢,如果销毁了那就又得重创建,太浪费时间了(用我们家乡话说就是太难费神了),所以不能销毁,但是系统也得通知你用户离开了(用的是onStop方法),因为可能需要暂停播放视频。当下次重新进入的时候,系统又会通知你用户又进来了,这时你可能要恢复播放了,但你有没有发现,用户第一次进入和再次进入,你需要做不同的处理,第一次可能是初始化一些资源,第二次可能只要恢复播放就可以了,所以系统应该告诉你,是第一次进入还是再次进入,于是系统就用了两个方法,用onCreate告诉你用户是第一次进入的,用onStart告诉你用户是再次进入。

    不过这还不算完,还有一种情况,用户是半离开状态,什么是半离开呢,都知道Android的界在有全屏,还是非全屏,也有半透明的,这里的半离开指的就是本界面被一个非全屏或半透明的界面盖住,总之,你还能看到一点点被盖的那个界面;全离开就是被全屏的界面盖住,用户完全看不到被盖的。这两种情况要有可能要区别对待,比如一个播放在线视频的应用,它可能希望要在用户半离开时只暂停播放,不暂停后台下载,而当用户完全离开时,播放和下载都暂停。所以系统也应该区分这种情况,于是就有了onPause和onResume来表示半离开和从半离开恢复。值得注意的是,Android中全离开包括了半离开,半离开不包括全离开,什么意思呢,就是即便是全离开,系统也是先调onPause再调onStop,从全离开中恢复,也是调了onStart后还会调onResume,而对于第一次进入,onCreate、onStart、onResume会被依次调用,所以记住,只要用户进入,无论是怎么进入的,都是调用onResume,在这里恢复播放是再适合不过的了。还有一个onDestory也说一下,就是在销毁的时候被调用,一般是回收资源或按了返回键会被销毁。现在清楚了,也顺便看一下Android官网的这张图吧:


    然后,你可能好奇系统是怎么调用到你写的onCreate方法的,有兴趣的可以查看源码的frameworks/base/core/java/android/app/ActivityThread.java,此类里面有许多handle***Activity方法,如handleResumeActivity,不过这不是本文章讨论的重点,后续有可能另写一篇讨论。

    下面我们来讨论一下Activity这个类吧,我估计很多人都忽略了Activity类也是一个类,它也可以有构造函数,你还可以在构造函数里初始化一些东西,不过请注意,Activity的onDestroy被调用时,Activity这个类本身还没有被销毁。还一点也很少人忽略,我常问应聘者Activity之间怎么通信,他们一般都会说Intent或AIDL,如果两个Activity是同一个应用的,一般是运行在同一进程中的(除非你在AndroidManifest里配置了让它们不运行在同一进程),而且一般是同一线程的,所以最简单的通信方法,莫过于在A Activity中写一个方法,让B Activity来调用,你再懒一点,直接访问变量都可以,只是风格不好。

    其它,还要说明的是,一个Activity包含了一个Window,Window才是真正代表一个窗口,也就是说Activity可以没有Window,那正好是Service了,论据就是刚刚说的ActivityThread类,他的职责包括处理Service,(ActivityThread不是Thread的子类,但他描述了主线程要做的事,具体本文暂不讨论)。Window包含了一个DecorView,这才是真正的界面元素,它是整个View树的根,你可以试试在Activity里调用下面这句代码把整个界面染红:

    [java]  view plain  copy
    1. getWindow().getDecorView().setBackgroundColor(Color.RED);  


    另外,还有一个ViewRoot,这个和DecorView经常有人搞混,首先是它对应的类的真正名字是ViewRootImpl,然后,他不是一个View,即他不是View的子类,他的工作与视觉元素无直接关系,但他确定Android View系统的一个重要类,它是负责通信的,如果你知道bridge设计模式就好理解了,这就是一个活生生的例子啊,不过不知道也没关系,不会阻碍对下文的理解,负责谁跟谁通信呢,是负责你的WindowManager与WindowManagerSerivce之间通信,整个系统的窗口都是由WindowManagerSerivce管理的,因为所有窗口的Z-order,事件分发,都要由一个中枢统一管理才可能有秩序,这就是WindowManagerSerivce的职责了。这样说,你肯定不能完全理解,要理解还是看代码吧,路径:frameworks/base/core/java/android/view/ViewRootImpl.java。其中有一句:

    [java]  view plain  copy
    1. mOrigWindowType = mWindowAttributes.type;  
    2.                     res = sWindowSession.add(mWindow, mSeq, mWindowAttributes,  
    3.                             getHostVisibility(), mAttachInfo.mContentInsets,  
    4.                             mInputChannel);  
    就是向WindowManagerSerivce注册了一个输入事件处理监听器mInputChannel,具体实现可以写一篇很长的文章,暂不讨论。

    这就是与Activity主要相关的信息,希望本文加深了你对Activity的理解。


    参考资料:

    官网指南:http://developer.android.com/guide/components/activities.html

    版权声明:本文为博主原创文章,转载请说明出处blog.csdn.net/yanquan345。
    展开全文
  • Elasticsearch是弄啥子

    2020-07-23 13:49:44
    Elasticsearch是弄啥子的 嗨!大家好,程序员读书栏目又回来了,这要感谢51CTO提供的录课专用麦克风。这次我们开始读Elasticsearch的官方文档。也就是ES, 那什么是ElasticSearch呢? You know, for search (and ...

    Elasticsearch是弄啥子的

    嗨!大家好,程序员读书栏目又回来了,这要感谢51CTO提供的录课专用麦克风。这次我们开始读Elasticsearch的官方文档。也就是ES, 那什么是ElasticSearch呢?

    You know, for search (and analysis)

    就像它的名字一样,它是用于搜索分析的。

    看到搜索有没有想到我们开发常用的关系性数据库?Mysql啊,PostgreSql啊什么的?那Elasticsearch又跟Mysql有什么区别呢?先前我们做搜索的确是使用的关系性数据库,但是对于文本的模糊查询使用关系性数据库的like语句性能比较低,可以想象一篇博客有2、3千字,如果要使用like语句判断这篇博客中是否出现了某个关键字,最坏的情况下计算机要进行2/3千次匹配计算,这个性能是很低的,Elasticsearch最初就是为了提高文本检索的性能开发的。它是怎么提高性能的呢?文档里也有介绍。我们接着往下面读。

    Elasticsearch is the distributed search and analytics engine at the heart of the Elastic Stack.

    这里提到Elasticsearch是Elastic技术栈中支持分布式搜索和分析的核心组件。既然是技术栈就不只包括Elasticsearch一种组件,那还包括那些组件呢?

    Logstash and Beats facilitate collecting, aggregating, and enriching your data and storing it in Elasticsearch. Kibana enables you to interactively explore, visualize, and share insights into your data and manage and monitor the stack. Elasticsearch is where the indexing, search, and analysis magic happens.

    这里对Elastic技术栈进行了简单的介绍,除了Elasticseach还包括用于数据搜集、聚合、加工处理的LogstachBeats.可以对数据进行交互式探索分析可视化的Kibana,Kibana还具备对技术栈中组件的管理和监控功能。Elasticsearch主要负责对数据进行索引处理,提供搜索分析服务。简单来说Elastic技术栈就是从数据的搜集到存储再到可视化分析提供了一条龙的服务,该去大厅的去大厅该上二楼的上二楼想去三楼的去三楼,一站式解决,服务一条龙。

    Elasticsearch provides near real-time search and analytics for all types of data. Whether you have structured or unstructured text, numerical data, or geospatial data, Elasticsearch can efficiently store and index it in a way that supports fast searches.

    Elasticsearch支持对所有数据类型的近实时搜索,我们刚才提到刚开始使用ES是为了提高全文检索的性能,随着ES的发展,它不但支持对文本类型数据还支持对数字甚至地理位置等类型数据进行快速的索引和搜索。功能是越来越强大,所以我们现在更倾向于说Elasticsearch是一个NoSql数据库。  

    这里还提到了俩个词structured or unstructured也就是结构化非结构化,有的同学可能还听过半结构化,他们之间有什么区别呢?或者说怎么区分数据是结构化的还是半结构化的还是非结构化的?  

    我是这么区分的:

    把数据分为数据的结构描述信息和具体的数据俩部分,什么意思呢?我们使用数据库中的一张学生表来举例,表本身是需要定义有多少字段,每个字段的类型、长度等信息的,这些定义的信息就是数据的结构描述信息,我们往表里插入的具体的学生名称啊学号啊这些就是具体的数据。那什么是结构化数据呢?结构化数据就是有固定结构描述信息的数据,比如我们数据库里的表,往表里插入的数据必须满足表的结构,无论你是多插入了一个不存在的字段还是数据长度超过了字段定义的长度都会报错,插不进去。  

    理解了结构化数据就不难理解非结构化数据了,非结构化数据就是没有结构描述信息的数据。比如我们在别人博客下面写的评论,可以说想怎么写就怎么写,很随意。

    那什么又是半结构化数据呢?半结构化的数据也有结构描述信息,但是又不像结构化数据那样结构比较固定,像Json和XML类型的数据,虽然有一定的结构,但在使用的过程中多添加一个原来不存在的字段也不会报错。

    在做大数据时经常会看到这三个词,这里顺便说下,我说的也未必对。还要提醒下大家,不要跟我学英语发音,因为我的英语发音不准,上学那会也是学的哑巴英语。 高考前猛看《高考必备》,不知道现在还有没,一本像词典一样的书,英语总分150,我当时考了138分的样子。考完就忘的差不多了。 很多同学应该都这样,高考前都是上知天文下知地理,高考一结束就都还给老师了。 

    我们接着往下面看:

    You can go far beyond simple data retrieval and aggregate information to discover trends and patterns in your data. And as your data and query volume grows, the distributed nature of Elasticsearch enables your deployment to grow seamlessly right along with it.

    我们不单可以使用ES做一些简单的数据检索和聚合分析去发现数据中的趋势和模式关系。我们还可以在数据越来越多的时候通过添加机器无缝的支持大数据量的处理。因为ES是原生支持分布式的。 

    While not every problem is a search problem, Elasticsearch offers speed and flexibility to handle data in a wide variety of use cases:

    当然并不是所有的问题都可以通过搜索解决的,ES也提供了良好的性能和灵活性去适应不同的业务场景。比如:

    Add a search box to an app or website

    在app或者网站上添加个搜索框,可以考虑使用ES提供搜索服务

    Store and analyze logs, metrics, and security event data

    还可以使用ES存储、分析系统运行日志、性能指标和安全相关的事件数据。

    Use machine learning to automatically model the behavior of your data in real time

    使用机器学习自动对数据进行建模。机器学习的功能应该是ES6以后才新增的功能,这几年是云、大数据、机器学习比较火。 技术类的产品经常跟这几个词挂钩。 

    Automate business workflows using Elasticsearch as a storage engine

    也可以将ES做为自动商业工作流中的存储引擎。

    Manage, integrate, and analyze spatial information using Elasticsearch as a geographic information system (GIS)

    也可以将ES做为一个地理位置信息系统使用,对地理位置信息进行管理和分析。  

    Store and process genetic data using Elasticsearch as a bioinformatics research tool

    也可以将ES用于生物信息研究中,用于存储和处理基因数据。

    官方给的这几个用例场景跨度还是蛮大的,从普通的网站到GIS再到生物信息。可以说ES的应用范围还是挺广的。

    We’re continually amazed by the novel ways people use search.

    虽然我们已经知道在很多不同领域中都有使用ES,但是我们还是经常被用户使用ES的方式震惊到。这里还是突出ES的灵活性,适用场景广泛。 有点王婆卖瓜的意思,是吧?

    But whether your use case is similar to one of these, or you’re using Elasticsearch to tackle a new problem, the way you work with your data, documents, and indices in Elasticsearch is the same.

    但是无论你的应用场景跟上面提到类似还是要使用ES解决新的问题,ES内部对数据、文档和索引的方式都是一样的,也就是万变不离其宗。所以我们有必要继续往下面看,继续学习下ES内部对数据的处理方式,什么是文档啊?什么是索引啊?

    我们这期就先读到这里,接下来你可以点个赞或者加个关注,鼓励我们一直读下去。

    天朗工作室出品

    展开全文
  • Appid: __UNI__2E5100B Command line invocation: /Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild archive -sdk iphoneos14.5 -project [PackagePath]/HBuilder.xcodeproj -archivePath [Package...
  • lua tonumber

    2019-04-10 22:25:00
    【1】应用tonumber函数 1 local function test(telnum) 2 local isLen = string.len(telnum) > 0 and string.len(telnum) < 7 and string.len(telnum) ~= 4 3 local value = tonumber(string.sub(t.....
  • 'Ready for use' : 'Needs to charge' } console.log(checkCharge(20)) // => 'Ready for use' console.log(checkCharge(0)) // => 'Needs to charge' 如果你在JavaScript上花了一些时间,你可能已经看到了三元操作...
  • (void)0是啥子意思

    千次阅读 2016-09-10 11:55:13
    (void)0 (+;) is a valid, but ‘does-nothing’ C++ expression, that’s ... It doesn’t translate to the no-op instruction of the target architecture, it’s just an empty statement as placeholder when
  • android studio新建模拟器中supported portrait选项是啥子意思,portrait是什么选项
  • E/android.os.Debug: failed to load memtrack module: -2 02-26 08:33:24.119 29624-29624/? E/memtrack: Couldn't load memtrack module (No such file or directory) 02-26 08:33:24.119 29624-29624/? E/...
  • 解决:Unable to start the virtual device.VirtualBox cannot start the virtual device.问题,一点点提升自己逼格~
  • 啥子是Bug Triage?

    2011-02-14 11:46:00
    Bug Triage Meeting – Severity & Priority "Triage" is a medical term. It refers to dividing wounded or sick people into three categories: those who will die no matter what you do, those...
  • 学而不思则罔,思而不学则殆 【Android】为啥子线程抛出异常主线程会崩溃?引言测试Java测试Android测试源码分析+找源码 引言 测试 Java测试 Android测试 源码分析+找源码
  • 尝试一把,满心期待的跳转,却发现界面啥子变化都木有。于是乎,F12打开浏览器控制台查看一把,BOOM!!!控制台抛了个这样式的东西出来,Not allowed to load local resource。 请出度娘,总结如下 若页面部署在...
  • deadlock due to user error in the design of an application or from issuing incorrect ad-hoc SQL. The following information may aid in determining the deadlock: Deadlock graph: ---------Blocker...
  • do_try_to_free_pages

    2018-05-18 01:30:00
    /** This is the main entry point to direct page reclaim.** If a full scan of the inactive list fails to free enough memory then we* are "out of memory" and something needs to be killed.** If the...
  • org.springframework.beans.factory.BeanDefinitionStoreException: Failed to process import candidates for configuration class [springfox.documentation.swagger2.configuration.Swagger2DocumentationConf
  • Unable to locate ADB, 如果连接出现上面(Unable to locate ADB)说明没有连接成功,可以去下个ADB Driver Installer看看有没有你的设备信息(可下可不下这个,因为要翻墙) 如果没有设备你的手机设备信息(确认手机...
  • 前言 大概是 本周周二[02.26]的时候吧, 我们同事 遇到了这样一个问题, 这个项目 不依赖其他项目, 然后 在开发环境...Caused by: java.lang.IllegalStateException: Failed to check the status of the service c...
  • HashMap是什么

    2020-03-24 19:01:10
    } inflateTable这个方法用于为主干数组table在内存中分配存储空间,通过roundUpToPowerOf2(toSize)可以确保capacity为大于或等于toSize的最接近toSize的二次幂,比如toSize=13,则capacity=16;to_size=16,capacity=...
  • fuc k,rescure mode 下竟然/boot分区东西都在,这是啥子情况!!!不懂,仔细检查看下 原来是uuid写错了,填写正确的uuid,修改为硬盘启动,OK!!完美启动 下次启动应该还会报错,修改/etc/boot/grub/...
  • otherwise, suppose remove at least x beads to make a clockwise rotation and remove at least y beads to make a counterclockwise rotation. If x≤y, print “Remove x bead(s), C”, otherwise print ...
  • Selenium报错:Message: Unable to find a matching set of capabilities,一般是浏览器版本与驱动版本不兼容导致的,但是如果一直找版本会浪费大量时间,不利于时间管理学 但是在代码中指定浏览器位置之后,解决...
  • fuc k,rescure mode 下竟然/boot分区东西都在,这是啥子情况!!!不懂,仔细检查看下 原来是uuid写错了,填写正确的uuid,修改为硬盘启动,OK!!完美启动 下次启动应该还会报错,修改/etc/boot/grub/...
  • ERROR 1142 (42000): SELECT command denied to user 'b'@'localhost' for table 't' 如果有权限就打开表继续执行,打开表的时候,执行器会根据表的引擎定义,去使用这个引擎提供的接口。 比如 例子中的表t中 id...
  •  Although we are only given frequencies for the leaves, we can define the frequency of any internal node to be the sum of the frequencies of its descendant leaves; this is, after all, the number of...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,941
精华内容 776
关键字:

to是啥子