《文本上的算法——深入浅出自然语言处理》读书笔记:第4章 如何计算得更快

目录

第4章 如何计算得更快

4.1 程序优化

4.2 分布式系统

4.3 Hadoop


第4章 如何计算得更快

随着数据量的爆炸式增长,如何存储和计算海量数据就成了一个问题,所以解决这个问题的分布式系统逐渐成为目前必不可少的技术之一。而线上业务怎么更好更快地完成用户请求,这个问题也是很重要的。

4.1 程序优化

在程序运行过程中,我们可以看到,整个过程中系统花费了大量的时间把信息从一个地方拷贝到另一个地方,hello程序的机器指令开始时是在磁盘上,程序加载时,它们被拷贝到主存,当处理器运行程序时,指令又从主存拷贝到处理器。这样就会有个问题需要系统设计者考虑,就是怎样设计存储器使这些拷贝操作尽可能地快。

《文本上的算法——深入浅出自然语言处理》读书笔记:第4章 如何计算得更快_第1张图片

《文本上的算法——深入浅出自然语言处理》读书笔记:第4章 如何计算得更快_第2张图片

存储器的设计如上图所示,可以将上一层次的存储器看作是下一层次存储器的高速缓存,越上层的速度越快但存储量越小,相反,越下层的速度越慢但存储量越大。

程序优化从大的方面来讲可以分为三个级别:(1) 系统级;(2)算法/数据结构级;(3)代码级。系统级对性能的影响最大,其次是算法/数据结构级,再次是代码级。系统级注重系统的整个流程、负载均衡等。

一个好的算法或数据结构对系统会有很大影响,快速傅里叶变换之所以在推动数字信号处理的快速发展起了很大作用,就是它将傅里叶变换从变成了,可以算是一个质的改进。所以说,我们在写程序的时候选用什么样的算法和什么样的数据结构都很重要。做出合适的选择的前提是,你要知道目前有哪些算法或者数据结构可以解决你的问题,例如优先队列、Trie树、跳表、Bloom Filter等这些算法。

代码级优化也很重要。越上层存储器越快,上层可以看成是下层的缓存,计算机的确会缓存,例如读磁盘的时候并不是一个字节一个字节读,而是一次读一个块到内存(尽管用户程序就是读一个字节),这样读下一个字节的时候就不用再和磁盘交互了,寄存器缓存也会做一样的事情。这就衍生出两个很重要的指导思想:

(1)尽可能使用上层存储器,能使用寄存器的时候就尽量不要使用内存,能使用内存的时候就尽量不要使用磁盘;

(2)计算机具有局部性。尽可能多用局部变量,因为局部变量大多会缓存在寄存器中,访问速度快;尽可能少调用函数,函数参数尽可能少,参数尽可能是指针或者引用,因为这可以减少拷贝;处理的数据尽可能紧凑且少,因为可以大概率地缓存到上层存储器中,这也是数据压缩的目的之一;尽可能顺序读写而不要随机读写,且尽量多使用刚读取的数据,因为程序局部性原理,最近使用的数据附近的数据会缓存起来;尽可能使用内存,而不是磁盘。

总之,想要写出高效的程序,除了学习算法和数据结构外,对计算机结构必须要了如指掌,这是根本,所谓万变不离其宗。然后就是多写程序,多看书,多思考,最重要的一点就是要有精益求精的态度。要想优化一定会有很多点可以优化,就看你愿不愿意做了。

4.2 分布式系统

分布式系统主要包括两部分:分布式存储和分布式计算。目前,分布式存储根据不同的业务产生了不同的数据库,尤其随着数据量的增大,就诞生了另一类数据库:NoSQL数据库。分布式计算模型大概有这几种:(1)多线程,最基本的方法;(2)Graphics Processing Units,利用图形处理器的高度并行结构来提高速度;(3)Message Passing Interface,一种消息传递编程模型;(4)MapReduce。

要想设计好分布式系统,需要考虑很多事情,如集群负载均衡、数据的正确性和完整性、服务器的错误处理等等。

4.3 Hadoop

Hadoop是一个软件平台,是Apache开源组织的一个分布式计算开源框架,可以让你很容易地开发和运行处理海量数据的应用。Hadoop框架中最核心的设计就是MapReduce和HDFS。可以说,Hadoop是基于分布式文件系统(HDFS)的MapReduce的实现。

分布式文件系统(HDFS)

HDFS采用master/slave架构。一个HDFS集群是由一个Namenode和一定数目的Datanode组成。Namenode是一个中心服务器,负责管理文件系统的名字空间以及客户端对文件的访问。集群中的Datanode一般是一个节点一个,负责管理它所在节点上的存储。

MapReduce

MapReduce任务是用来处理键/值对的。该框架将每个输入的记录成转换一个键/值对,每对数据会被输入给Map作业。

你可能感兴趣的:(#,深度学习,人工智能,自然语言处理,nlp)