关于海量数据处理软件的程序设计

关于海量数据处理软件的程序设计

在现实社会里,尤其在医学、股票和气象等领域中经常存在着对海量数据进行分析的需求。一种解决这类问题的方法是在数据处理前先主观确定一个标准,然后将数据进行无量纲化及归一化处理。这样常常导致运算结果不仅含有诸多主观因素,而且在运算前就改动了数据的原始性,通常这类方法运算相对复杂,因此也难以被人们掌握。另一种解决的方法是建立一个适合于并行算法的数据模型,推导出能够解决实际问题的理论公式,通过设计一个高效的并行算法,在高性能的并行处理机上来实现最终的分析。然而大型的并行处理机对使用低端设备的用户来说是可望而不可及的,为了解决在微机上进行海量数据处理的问题,本文从程序设计的角度阐述了一个海量数据的处理方法,即通过使用良好的编程方法和合理的数据结构,使设计出的程序在功能完善的基础上,达到执行效率的最优和空间开销的最省。

线程与临界资源

导致数据处理软件运行缓慢的原因,主要是因为程序中有串行分量的存在,要改善整个系统的执行效率,最好是利用提高运算部分的并行负载量的方法,这种方法可以用在诸如医学数据检测这样求解规模可扩放、数据间相对孤立的问题中。通过提取出问题中存在的可并行工作的分量,然后用程序实现这些并行分量的并行执行,这样才能提高海量数据的处理速度。
众所周知,Win 32系统的应用程序是以进程的方式来工作的。一个进程就是操作系统调入内存来执行的一个应用程序,系统为每个进程分配4 GB的虚拟地址空间装载代码和数据。而线程作为一种操作系统对象存在进程的内部,他是程序中最基本的执行实体,其自身不占用系统额外的开销而是共享进程分配到的空间,通过线程可以实现程序执行的并发性、独立性和异步性。每个线程都有自己的一组CPU寄存器和堆栈,操作系统为每个独立的线程安排CPU时间、调度其状态,使线程可以分别处于工作态、挂起态和就绪态,从而实现不同线程间的切换。多线程技术的主要优势在于充分利用CPU的空闲时间片,可以用尽量少的时间来对用户的要求做出响应,使得系统的整体运行效率得到较大的提高,增强了应用程序的灵活性。通常每个应用程序中至少存在一个线程,他被称为主线程或默认线程,应用程序也可以根据需要动态地创建多个线程来执行不同的任务。但由于Win 32系统管理作。当线程工作完后,其使用的资源将自动释放。程序员在开发海量数据处理软件时,就可以利用Windows编程方法中的多线程技术分别设计出功能不同的两类线程:一类是对原始数据进行分析处理,得出运算结果的消费类线程;另一类是负责为消费类线程提供原始数据的生产类线程。软件高效运行的实质就是多个这两类线程协同工作的结果,整个程序的执行效率也会大幅度提升。
  从程序设计的角度看,尽管多线程技术能够改善整个程序的执行效率。但是,由于线程是根据其自身优先级的高低以抢占方式使用系统资源的,所以如果线程对系统资源使用不当,就可能会造成两个功能模块因为相互等待对方使用的资源而产生死锁现象,从而导致整个操作系统的崩溃。为了协调多线程有效地使用临界状态下的系统资源,还需要用互斥和同步等方法对其线程进行合理地控制。

数据结构的选择

当确定使用多线程技术来提高软件的执行速度后,如何设计数据结构来配合多线程高效工作,如何使应用程序运行时占用的内存空间最少就成为下一步要解决的主要问题。
  通过对数据的使用特性进行分析,可以发现尽管原始数据十分庞大,但都是以顺序地方式被程序读取的,因此可以先将他们存贮在一个单向的、先进先出的数据结构—队列中。由于队列是单向的,当其中的数据被使用后,需要原始数据的消费类线程必须等待生产类线程重新添满数据队列后才能开始工作,这无疑在一定程度上影响了软件的执行效率。使用首尾相接的循环队列可以解决这个问题。通过建立一个足够大的循环队列,可以让程序反复地利用这块内存空间,从而达到节省代码存贮空间与程序运行空间的目的。同时可以保证数据处理线程总能得到要加工的数据,以流水的方式进行工作。

实际应用

面是一个关于心电检测系统的设计,这个系统的设计目标是快速分析24 h的(ECG)心电数据判断其中是否含有疾病的特征分量。其中原始的心电数据共12路分别对应着12个导联的心电信号,其中每路数据的采样频率为250 Hz,这样每分钟将产生180 kB的数据,每小时的数据量可达10.8 MB,24 h的数据总量将超过260 MB。面对这样大量的数据,检测软件需要对这些心电数据进行复杂的数学运算,提取出心电波形,确定其中P,R,T波等几个关键波形的具体位置,从而进一步判断出是否有心脏疾病的存在。

线程的控制

由于波形检测线程(消费类线程)、读数据线程(生产类线程)和心电波形显示线程(消费类线程)都存在着对原始心电数据缓冲区和检测结果数据缓冲区这些临界资源的访问。为了防止这些线程访问临界资源时不会产生死锁现象,在程序中主要采用互斥、信号量同步的方式来对线程进行控制和管理。其中,控制线程协同工作的具体模式可以归结为如下3种类型。
  (1)当生产类线程向缓冲池中写数据时,消费类线程不能同时从缓冲池中读数据。生产类线程与消费类线程是互斥的访问关系。
  (2)当多个生产类线程同时向缓冲池中写数据时,各生产类线程之间是以互斥方式来工作的。
  (3)当多个消费类线程同时从缓冲池中读数据时,各消费类线程之间是以信号量同步的方式对数据区进行访问。
文章知识点与官方知识档案匹配,可进一步学习相关知识算法技能树首页概览34053 人正在系统学习中

来源:susubuhui

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2009年2月4日
下一篇 2009年2月4日

相关推荐