内存映射技术在大数据存储应用中的研究*

2020-06-08 10:08段小芳
通信技术 2020年5期
关键词:数据文件数据量内存

段小芳,刘 丹

(中国电子科技集团公司第三十研究所,四川 成都 610041)

0 引 言

在无线网络技术研究中,存储各种重要活动中的无线网络信号数据,并在后期对存储的数据进行深入分析,对弥补网络功能不足和对网络性能提升具有重要意义。后期的各种分析必须以数据的实时存储为前提,数据存储的完整性、时效性等直接影响到后期分析所能获取情报知识的程度。因此针对无线网络的大数据实时高效存储是必须解决的一项关键技术。

在当今世界对自主知识产权越发重视的背景下,各种设备及技术的国产化需求日益迫切,国产化操作系统的应用日渐普及。在这种背景下,Qt 作为一种可以跨操作系统的软件开发平台具有其明显的优势,通过一次开发,多处编译,轻易地实现跨平台移植,因其顺应国产化的需求越加广泛地被应用到各种软件开发中。

本文基于Qt 平台,采用内存映射技术,设计并实现了一种大数据文件的实时存储方案,可实现对无线信号大数据量的实时存储,并通过设计有效的索引机制,实现对存储文件的高效读取。最后通过测试程序对内存映射大数据文件实时存储技术进行了实验验证。

1 应用需求分析

在无线网络信号的存储应用中,可以将需要进行数据存储的情况分为两类:一是接收特定频率范围内的所有目标信号;二类是接收已知信号特征的特定目标信号。

接收特定频率范围内的所有目标信号时,为了后期分析处理过程中能将信号完全还原,需依据Nyquist 采样原理,存储以频率带宽2 倍的采样率采样后的中频信号,频率范围的大小决定了需要存储的数据量的大小。以网络工作频率带宽为150 MHz为例,需要以300 M sample/s,16 bits 采样,1 秒钟的数据量为480 MB,这样高的写入速率通常的文件I/O 操作根本无法满足需求。

接收已知信号特征的特定目标信号时,通过解调解码可获取信号的某些特征,可仅存储解调解码后的数据,此时需存储的数据量远远小于全频段采样数据,数据量由网络通信协议和流量决定。如果仅考虑文件写入速率,采用普通的文件I/O 似乎可以满足需求。但是在实际应用中,对无线信号的侦察站通常无人值守,对目标信号的存储至少应满足连续24 小时存储的需求,长时间数据存储的大数据量不可忽视。基于文件I/O 操作的普通文件操作,针对如此大的数据文件,不仅其存储速度慢,更容易在存储过程中出现压力过大、运行不可靠等问题。

本文将在Qt 平台下采用内存映射技术,设计实现满足上述存储需求的大数据实时存储方案。并针对在后期离线分析时,需要在大数据文件中搜索某些关键数据进行深入分析的需求,设计了有效的文件索引机制,极大地方便对大数据文件进行数据搜索的操作。

2 内存映射文件

内存映射文件,是由一个文件到一块内存的映射。通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而且在对该文件进行操作之前必须首先对文件进行映射。使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行I/O 操作,数据存储速度大大提高,使得内存映射文件在处理大数据量的文件时能起到相当重要的作用[1-3]。

内存映射技术最大的优点在于,不对文件执行I/O 操作就能处理存储于磁盘上的文件,这样做在数据处理的过程中将不需要为所有的文件重新申请并分配缓存,这类缓存操作将由系统直接进行管理,从而大大提高了系统的运行效率[4]。

3 方案设计

3.1 Qt 中的内存映射流程

Qt 中采用内存映射进行文件存储的标准流程如下图1 所示。

图1 内存映射数据存储的标准的流程图

但是在大数据文件读写应用中,由于数据文件远超Windows 进程能分配的最大地址空间(2 GB),只能将数据文件分段映射,每次只映射文件的一部分(不能超过2 GB)[3]。在做方案设计时,我们以满足数据量的极限情况为目标,但是在实际情况下的数据量往往远小于极限情况,因此本方案设计了一种依据实际数据量动态调整数据文件长度的机制,可更加合理有效的使用内存和磁盘空间。本方案的内存映射文件存储流程如图2 所示。

图2 大数据文件内存映射数据存储的流程图

3.2 大数据文件存储涉及的关键技术

3.2.1 关键函数说明

在图2 大数据文件内存映射存储数据的流程中涉及的关键函数描述如下。

(1)QFile::QFile(const QString &name)

QFile 构造函数,用于创建文件对象。参数name 表示在磁盘上需要操作的文件名称。

(2)bool QFile::open(OpenMode mode)

用于打开文件,如果指定的文件不存在,将自动创建。参数mode 表示打开文件的方式,可以选择仅写入,仅读取,或者可读可写等。

(3)bool QFile::resize(qint64 sz)

用于设置文件的长度,参数sz 表示文件的长度。

(4)uchar *QFileDevice::map(qint64 offset, qint64 size, MemoryMapFlags flags = NoOptions)

用于对文件进行映射,返回值为映射后的内存指针。参数offset 表示需要进行内存映射的数据段在相对文件起始位置的偏移值;参数size 表示需要映射的数据块的大小。QFileDevice 类是QFile 类的父类。

(5)bool QFileDevice::unmap(uchar *address)

用于取消内存映射,参数address 上述映射成功的内存指针。

(6)void QFileDevice::close()用于关闭文件

3.2.2 关键步骤说明

图2 流程图中,有几个关键步骤说明如下:

(1)设置文件长度为BLOCK_LEN*m_count

BLOCK_LEN 为自定义的文件初始长度,由于Windows 进程能分配的最大虚拟地址空间为4 GB,但是在实际应用中4 GB 的空间不能全部被占用进行内存映射实现数据存储。m_count 为进行文件长度扩展的次数,初始值为1。

该步骤的含义描述:新建文件时,将文件长度设置为BLOCK_LEN,假设BLOCK_LEN 等于1 GB。当存储的数据将该1 GB 的文件长度写满以后,动态扩展文件的长度到2 GB,依次类推,当前的数据文件不断被写满后,不断的将文件长度增加1 GB。这样可有效合理的利用内存和磁盘空间。

(2)对文件进行映射获取映射后的内存指针

该步骤的含义描述:假设新建文件时,文件长度为1 GB,这时进行文件映射可以将整个文件的1 GB 空间进行映射,获取这1 GB 内存空间的指针。当文件长度扩展到2 GB 时,由于文件的前1 GB 空间已经写满了数据,此时只需要映射文件的后1 GB长度。依次类推,当文件长度不断被扩展后,不管扩展后的文件长度有多长,始终只需要映射文件的最后1 GB 空间。

(3)文件写入结束后调整文件长度为实际数据的长度

如上所述将文件扩展长度的步进设置为1 GB,如果刚扩展文件后,就需要停止数据写入,如果就这样取消映射关闭文件,那么磁盘上的数据文件中将会存在1 GB 的无效数据,浪费磁盘存储空间。

为了避免这种情况,在Visual Studio 等平台下的通常做法是以写入的实际数据长度创建新的文件进行内存映射,将数据从原文件复制到新的文件。当进行大数据文件的拷贝时,同样受进程可分配最大地址空间的限制,必须多次拷贝,极大的影响数据存储处理的效率。在本方案中完成数据写入后,利用Qt 系统提供的QFile::resize 函数直接将原数据文件的长度设置为实际数据的长度,此过程可直接保留原数据文件中的有效数据删除无效数据,省去了新数据文件的创建和数据拷贝过程,有效地避免磁盘空间浪费的同时也提高了数据存储处理的效率。

(4)流程中多次反复打开关闭文件对象

在图2 的流程中,在每次进行内存映射或者取消内存映射前都会打开文件,在映射或者取消映射完成后及时关闭文件,这样做的原因是为了避免长期对磁盘文件的占用,而导致其它应用对该文件的访问无效。例如,在实时存储数据的过程中,可能需要通过其它应用程序实时对存储的数据文件进行读取分析处理,在内存映射存储数据过程中及时关闭文件可以有效地避免对文件的访问冲突。

3.3 文件索引设计

对数据文件的索引设计通常采用的方式为,在数据文件的起始段中专门预留一部分空间用来记录索引信息。但是在大数据存储应用中,无法估计需要记录的索引信息的长度,如果预留记录索引的空间不足则必须新建数据文件,当数据存储时间较长时会产生很多数据文件,不便于对数据文件的管理。如果预留记录索引的空间较大,在应用中由于文件的长度的动态扩展,使得预留较大空间记录索引信息既不便于实现也可能造成存储空间浪费。

在本方案中,采用了将源数据和索引信息独立记录在两个文件中的方式。时间信息通常是所有无线信号数据所具有的关键信息,将时间每进行1 秒钟后存储数据相对数据文件起始的偏移作为索引值,记录在索引文件中。索引文件的结构,以及在数据文件的写入过程中如何在索引文件中记录索引值的描述如下图3 所示。索引文件的读写同样可采用内存映射的方式实现。

图3 索引文件的结构和索引值记录描述

按照以上方式,如果在索引文件中以10 字节表示年月日时分秒在内的时间信息,以8 字节表示偏移地址,那么只需要占用675 KB 的磁盘空间就可以为连续24 小时的数据存储建立索引,以极小的磁盘空间换取了数据搜索效率的极大提高。

4 实验验证

测试环境描述:Windows 7 旗舰版64 位操作系统,Intel Core i7-377os 处理器,3.10 GHz CPU,8 GB RAM。

在以上测试环境下编写测试程序,首先模拟产生了512 B 的数据,然后以内存映射和传统I/O 两种方式创建文件[5],并循环将模拟的512 B 数据写入文件,直到文件写满,分别记录两种文件写入方式创建并写满2 GB、5 GB、10 GB 文件的耗时和速率对比,如下表1 所示。计时起点为QFile::open,计时终点为文件写满后取消文件映射,关闭文件对象。

表1 两种文件写入方式对比

从上述测试结果可以看出内存映射写入文件的速率远高于传统I/O 文件写入的速率。以表1 中内存映射文件的速率1500 MB/s 计算,理论可满足375 MHz 带宽,750 M sample/s,16 bits 采样的无线信号中频采样数据存储需求。

上述测试结果是在测试程序功能相对单一的情况下获取,在实际应用软件功能复杂的情况下,可能会对文件存储处理速率稍有影响,但至少可保证满足带宽小于300 MHz 的无线信号中频采样数据存储需求。

5 结 语

本文以无线网络信号的存储需求和技术设备的国产化需求为背景,在Qt 平台下设计了一种基于内存映射技术的大数据实时存储方案。并通过编写测试程序,验证了该方案既可满足对无线信号解调数据连续24 小时的实时存储需求,也可满足带宽小于300 MHz 的无线信号中频采样数据的实时存储需求。同时由于该方案基于Qt 平台设计,也解决了国产化背景下软件的跨平台移植问题。

猜你喜欢
数据文件数据量内存
基于大数据量的初至层析成像算法优化
高刷新率不容易显示器需求与接口标准带宽
宽带信号采集与大数据量传输系统设计与研究
笔记本内存已经在涨价了,但幅度不大,升级扩容无须等待
“春夏秋冬”的内存
基于表空间和数据文件探讨MIS中数据库架构设计
基于网络环境的社区协同办公问题探讨(二)
内存搭配DDR4、DDR3L还是DDR3?
气象数据文件异机备份程序浅析
上网本为什么只有1GB?