CN111143236A - 一种内存映射实现队列及其数据读取和写入方法 - Google Patents
一种内存映射实现队列及其数据读取和写入方法 Download PDFInfo
- Publication number
- CN111143236A CN111143236A CN201911245653.5A CN201911245653A CN111143236A CN 111143236 A CN111143236 A CN 111143236A CN 201911245653 A CN201911245653 A CN 201911245653A CN 111143236 A CN111143236 A CN 111143236A
- Authority
- CN
- China
- Prior art keywords
- data
- queue
- file
- index
- reading
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/0223—User address space allocation, e.g. contiguous or non contiguous base addressing
- G06F12/023—Free address space management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/06—Addressing a physical block of locations, e.g. base addressing, module addressing, memory dedication
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/08—Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
- G06F12/10—Address translation
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明涉及一种内存映射实现队列及其数据读取和写入方法,通过利用文件内存映射的方式,将文件作为队列的数据存储,用同样的方式产生队列索引及队列元素数据进行存储;基于本地文件且通过内存映射方式的访问文件,可以达到快速定位文件位置、读取相关位置的内容、省去网络通信步骤的目的,提高高吞吐的保障,内存映射利用系统完成落盘,即使应用崩溃也不会影响数据落盘,提高容错性。本发明可以有效解决单体应用中队列的需求,让单体应用不通过引入第三方服务,以及不通过网络通信的情况下,具备流量削峰的数据暂存、转存的能力。
Description
技术领域
本发明涉及电数字数据处理的技术领域,特别涉及一种内存映射实现队列及其数据读取和写入方法。
背景技术
随着开发框架和技术的流行,在应用开发过程中,对于队列的使用,开发人员有越来越多的选择,包括如ActiveMQ的传统JMS实现,如kafka之类的分布式领域的佼佼者等,现有的队列框架技术几乎覆盖了绝大多数应用场景。
然而在部分时候,开发人员其实只需要一个本地存储队列来完成临时转存数据的需要,无需分布式部署、无需分区容错、更不需要网络通信。比如,一个应用于外部数据的处理,可能由于外部数据流入系统时的流量不均匀而导致在流量大的时候系统内部无法及时处理的、具有暂存功能的且具有持久化特性的临时队列。
发明内容
为了解决现有技术中存在的问题,本发明提供一种优化的内存映射实现队列及其数据读取和写入方法。
本发明所采用的技术方案是,一种内存映射实现队列,所述队列包括:
一元数据文件,用于记录队列头部和尾部数据;
若干索引文件,用于以若干索引数据对应若干队列数据;
若干队列数据文件,用于存储队列元素数据。
优选地,所述队列头部和尾部数据为头指针和尾指针;头指针指向队列下一个入队元素的索引文件的编号,尾指针指向队列下一个读取元素的索引文件的编号。
优选地,任一所述索引数据对应的队列数据包括队列元素数据的数据文件编号、元素数据的偏移量、元素数据的长度及入队时间戳信息。
优选地,任一所述索引数据的长度固定。
一种所述的内存映射实现队列的数据读取方法,所述方法包括以下步骤:
步骤1.1:读取元数据文件中的尾指针,获得索引文件;
步骤1.2:解析索引文件,得到索引数据对应的队列数据;
步骤1.3:基于解析得到的队列数据,从指定位置读取指定长度的数据作为读取数据;
步骤1.4:更新元数据文件的尾指针。
优选地,所述步骤1.2中,索引数据对应的队列数据包括数据文件编号、数据偏移量及数据长度。
优选地,所述读取数据被读取后,触发回收流程;所述回收流程为所有队列元素数据都被读取后删除对应的队列数据文件。
一种所述的内存映射实现队列的数据写入方法,所述方法包括以下步骤:
步骤2.1:读取元数据文件中的头指针,获得索引文件;
步骤2.2:解析索引文件,得到索引数据对应的待入队数据文件;
步骤2.3:计算队列的剩余容量,若剩余容量满足待入队数据文件的写入,则直接将待入队数据文件加入队列,否则,进行下一步;
步骤2.4:为当前待入队数据文件创建新的索引数据,写入队列数据,索引数据记录对应的队列数据并被追加至索引文件;
步骤2.5:更新元数据文件中的头指针。
优选地,所述步骤2.2中,索引数据对应的待入队数据文件包括待写入的数据文件、数据偏移量和数据长度。
优选地,所述步骤2.4中,对应的队列数据包括数据文件编号、元素数据的长度、元素数据的偏移量及入队时间戳信息。
本发明提供了一种优化的内存映射实现队列及其数据读取和写入方法,通过利用文件内存映射的方式,将文件作为队列的数据存储,用同样的方式产生队列索引及队列元素数据进行存储;基于本地文件且通过内存映射方式的访问文件,可以达到快速定位文件位置、读取相关位置的内容、省去网络通信步骤的目的,提高高吞吐的保障,内存映射利用系统完成落盘,即使应用崩溃也不会影响数据落盘,提高容错性。
本发明可以有效解决单体应用中队列的需求,让单体应用不通过引入第三方服务,以及不通过网络通信的情况下,具备流量削峰的数据暂存、转存的能力。
附图说明
图1为本发明的内存映射实现队列结构示意图,其中,箭头表示数据指向的方向;
图2为本发明的数据读取方法流程图;
图3为本发明的数据写入方法流程图。
具体实施方式
下面结合实施例对本发明做进一步的详细描述,但本发明的保护范围并不限于此。
本发明涉及一种内存映射实现队列,内存映射是一种可以应用的方式,将一个文件或者其它对象映射到进程的地址空间,进而实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系;实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read、write等系统调用函数,同时,内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进程间的文件共享。
所述队列包括:
一元数据文件,用于记录队列头部和尾部数据;
若干索引文件,用于以若干索引数据对应若干队列数据;
若干队列数据文件,用于存储队列元素数据。
所述队列头部和尾部数据为头指针和尾指针;头指针指向队列下一个入队元素的索引文件的编号,尾指针指向队列下一个读取元素的索引文件的编号。
任一所述索引数据对应的队列数据包括队列元素数据的数据文件编号、元素数据的偏移量、元素数据的长度及入队时间戳信息。
任一所述索引数据的长度固定。
本发明中,事实上,队列的组成只有一种文件,PageFile,每一个PageFile的本质就是一个普通文件且在初始化的时候就配置了固定大小,每个PageFile都通过mmap方式进行读写。
本发明中,所有的PageFile从逻辑上分成三类:MetaPageFile(元数据文件)、IndexPageFile(索引文件)和DataPageFile(数据文件)。
本发明中,每个数据文件都是固定的,由前一个元素的索引可以得知该数据文件的剩余空间的偏移量,从而可以得知数据文件的剩余空间是否能容纳该元素,如果不能,则新建一个数据文件用以写入数据。
本发明中,队列元素数据指的是实际业务层面数据,有别于队列数据。
本发明中,元数据文件、索引文件和队列数据文件这三类文件都存储有数据,但每一类文件中存储的数据是不一样的;元数据文件中存储的数据指向索引文件中的数据,索引文件中存储的数据指向实际业务数据的,而队列数据文件中存储的就是实际业务数据,即通过元数据文件找到对应的索引文件,通过对应索引文件位置上的数据找到实际数据存储位置;故还需要明确具体指向的编号(位置)。
本发明还涉及一种所述的内存映射实现队列的数据读取方法,读取即是从队列尾部读取数据,与写入相对。
所述方法包括以下步骤:
步骤1.1:读取元数据文件中的尾指针,获得索引文件;
步骤1.2:解析索引文件,得到索引数据对应的队列数据;
所述步骤1.2中,索引数据对应的队列数据包括数据文件编号、数据偏移量及数据长度。
步骤1.3:基于解析得到的队列数据,从指定位置读取指定长度的数据作为读取数据;
步骤1.4:更新元数据文件的尾指针。
所述读取数据被读取后,触发回收流程;所述回收流程为所有队列元素数据都被读取后删除对应的队列数据文件。
本发明中,定位到具体数据文件以及数据文件中的偏移量后,按照索引中给定的数据长度,从指定的偏移量开始读取指定长度的数据,即是需要读取的数据。
本发明中,读取数据后,因为下一个要读取的位置已经发生变化,所以会同时更新元数据文件的尾指针。
本发明中,读取了队列元素数据后,即表明该数据已经不再需要保存,此时会触发一个回收事件;基于性能考虑,并不会一定进行清空队列元素的操作,而是等整个数据文件的元素都被读取了,才会将该文件删除,达到批量回收清空的目的;其中,是否所有数据都被读取过可以通过元数据文件知晓,队列数据文件删除即是回收,用于释放磁盘空间。
本发明还涉及一种所述的内存映射实现队列的数据写入方法,所述方法包括以下步骤:
步骤2.1:读取元数据文件中的头指针,获得索引文件;
步骤2.2:解析索引文件,得到索引数据对应的待入队数据文件;
所述步骤2.2中,索引数据对应的待入队数据文件包括待写入的数据文件、数据偏移量和数据长度。
步骤2.3:计算队列的剩余容量,若剩余容量满足待入队数据文件的写入,则直接将待入队数据文件加入队列,否则,进行下一步;
步骤2.4:为当前待入队数据文件创建新的索引数据,写入队列数据,索引数据记录对应的队列数据并被追加至索引文件;
所述步骤2.4中,对应的队列数据包括数据文件编号、元素数据的长度、元素数据的偏移量及入队时间戳信息。
步骤2.5:更新元数据文件中的头指针。
本发明中,通过偏移量和数据文件总容量来计算出剩余容量。
本发明中,如果剩余容量小于待写入的数据长度,那么将创建一个索引数据,并写入队列数据。
本发明中,一份索引数据包含了数据文件名称的编号、实际业务数据写入的时间、实际业务数据的长度等属性,这些属性在索引文件中保存方式是一段一段的,故事实上,步骤2.4中的索引数据将以索引段的形式进行创建和保存。
本发明中,因为索引文件发生了变动,故需要更新元数据文件中的头指针。
本发明通过利用文件内存映射的方式,将文件作为队列的数据存储,用同样的方式产生队列索引及队列元素数据进行存储;基于本地文件且通过内存映射方式的访问文件,可以达到快速定位文件位置、读取相关位置的内容、省去网络通信步骤的目的,提高高吞吐的保障,内存映射利用系统完成落盘,即使应用崩溃也不会影响数据落盘,提高容错性。
本发明可以有效解决单体应用中队列的需求,让单体应用不通过引入第三方服务,以及不通过网络通信的情况下,具备流量削峰的数据暂存、转存的能力。
Claims (10)
1.一种内存映射实现队列,其特征在于:所述队列包括:
一元数据文件,用于记录队列头部和尾部数据;
若干索引文件,用于以若干索引数据对应若干队列数据;
若干队列数据文件,用于存储队列元素数据。
2.根据权利要求1所述的一种内存映射实现队列,其特征在于:所述队列头部和尾部数据为头指针和尾指针;头指针指向队列下一个入队元素的索引文件的编号,尾指针指向队列下一个读取元素的索引文件的编号。
3.根据权利要求1所述的一种内存映射实现队列,其特征在于:任一所述索引数据对应的队列数据包括队列元素数据的数据文件编号、元素数据的偏移量、元素数据的长度及入队时间戳信息。
4.根据权利要求3所述的一种内存映射实现队列,其特征在于:任一所述索引数据的长度固定。
5.一种权利要求1~4之一所述的内存映射实现队列的数据读取方法,其特征在于:所述方法包括以下步骤:
步骤1.1:读取元数据文件中的尾指针,获得索引文件;
步骤1.2:解析索引文件,得到索引数据对应的队列数据;
步骤1.3:基于解析得到的队列数据,从指定位置读取指定长度的数据作为读取数据;
步骤1.4:更新元数据文件的尾指针。
6.根据权利要求5所述的数据读取方法,其特征在于:所述步骤1.2中,索引数据对应的队列数据包括数据文件编号、数据偏移量及数据长度。
7.根据权利要求5所述的数据读取方法,其特征在于:所述读取数据被读取后,触发回收流程;所述回收流程为所有队列元素数据都被读取后删除对应的队列数据文件。
8.一种权利要求1~4之一所述的内存映射实现队列的数据写入方法,其特征在于:所述方法包括以下步骤:
步骤2.1:读取元数据文件中的头指针,获得索引文件;
步骤2.2:解析索引文件,得到索引数据对应的待入队数据文件;
步骤2.3:计算队列的剩余容量,若剩余容量满足待入队数据文件的写入,则直接将待入队数据文件加入队列,否则,进行下一步;
步骤2.4:为当前待入队数据文件创建新的索引数据,写入队列数据,索引数据记录对应的队列数据并被追加至索引文件;
步骤2.5:更新元数据文件中的头指针。
9.根据权利要求8所述的数据写入方法,其特征在于:所述步骤2.2中,索引数据对应的待入队数据文件包括待写入的数据文件、数据偏移量和数据长度。
10.根据权利要求8所述的数据写入方法,其特征在于:所述步骤2.4中,对应的队列数据包括数据文件编号、元素数据的长度、元素数据的偏移量及入队时间戳信息。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911245653.5A CN111143236A (zh) | 2019-12-07 | 2019-12-07 | 一种内存映射实现队列及其数据读取和写入方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911245653.5A CN111143236A (zh) | 2019-12-07 | 2019-12-07 | 一种内存映射实现队列及其数据读取和写入方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN111143236A true CN111143236A (zh) | 2020-05-12 |
Family
ID=70518026
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201911245653.5A Pending CN111143236A (zh) | 2019-12-07 | 2019-12-07 | 一种内存映射实现队列及其数据读取和写入方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111143236A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112486913A (zh) * | 2020-11-12 | 2021-03-12 | 思创数码科技股份有限公司 | 一种基于集群环境下的日志异步存储方法和设备 |
CN113194266A (zh) * | 2021-04-28 | 2021-07-30 | 深圳迪乐普数码科技有限公司 | 图像序列帧实时渲染方法、装置、计算机设备及存储介质 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20050204103A1 (en) * | 2004-03-01 | 2005-09-15 | Avici Systems, Inc. | Split queuing |
CN102637147A (zh) * | 2011-11-14 | 2012-08-15 | 天津神舟通用数据技术有限公司 | 利用固态硬盘作为计算机写缓存的存储系统以及相应的管理调度方法 |
CN104050268A (zh) * | 2014-06-23 | 2014-09-17 | 西北工业大学 | 一种日志空间在线可调整的连续数据保护和恢复方法 |
CN110134439A (zh) * | 2019-03-30 | 2019-08-16 | 北京百卓网络技术有限公司 | 无锁化的数据结构构建方法和写入数据、读取数据的方法 |
US10467193B1 (en) * | 2016-06-24 | 2019-11-05 | EMC IP Holding Company LLP | Real-time ad hoc querying of data records |
-
2019
- 2019-12-07 CN CN201911245653.5A patent/CN111143236A/zh active Pending
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20050204103A1 (en) * | 2004-03-01 | 2005-09-15 | Avici Systems, Inc. | Split queuing |
CN102637147A (zh) * | 2011-11-14 | 2012-08-15 | 天津神舟通用数据技术有限公司 | 利用固态硬盘作为计算机写缓存的存储系统以及相应的管理调度方法 |
CN104050268A (zh) * | 2014-06-23 | 2014-09-17 | 西北工业大学 | 一种日志空间在线可调整的连续数据保护和恢复方法 |
US10467193B1 (en) * | 2016-06-24 | 2019-11-05 | EMC IP Holding Company LLP | Real-time ad hoc querying of data records |
CN110134439A (zh) * | 2019-03-30 | 2019-08-16 | 北京百卓网络技术有限公司 | 无锁化的数据结构构建方法和写入数据、读取数据的方法 |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112486913A (zh) * | 2020-11-12 | 2021-03-12 | 思创数码科技股份有限公司 | 一种基于集群环境下的日志异步存储方法和设备 |
CN112486913B (zh) * | 2020-11-12 | 2023-09-22 | 思创数码科技股份有限公司 | 一种基于集群环境下的日志异步存储方法和设备 |
CN113194266A (zh) * | 2021-04-28 | 2021-07-30 | 深圳迪乐普数码科技有限公司 | 图像序列帧实时渲染方法、装置、计算机设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8682867B2 (en) | Deleted data recovery in data storage systems | |
US10732857B2 (en) | Techniques for reducing memory write operations using coalescing memory buffers and difference information | |
CN108733344B (zh) | 数据读写方法、装置以及环形队列 | |
US7747813B2 (en) | Multi-memory device system and method for managing a lifetime thereof | |
US7904764B2 (en) | Memory lifetime gauging system, method and computer program product | |
US7949839B2 (en) | Managing memory pages | |
US20120151125A1 (en) | Data processing method for nonvolatile memory system | |
CN109902034B (zh) | 快照创建方法、装置、电子设备及机器可读存储介质 | |
CN109614055B (zh) | 快照创建方法、装置、电子设备及机器可读存储介质 | |
CN110597762A (zh) | 文件处理方法、装置、设备及存储介质 | |
US11169968B2 (en) | Region-integrated data deduplication implementing a multi-lifetime duplicate finder | |
CN111143236A (zh) | 一种内存映射实现队列及其数据读取和写入方法 | |
CN109213450B (zh) | 一种基于闪存阵列的关联元数据删除方法、装置及设备 | |
CN112463020A (zh) | 基于Flash的数据存取方法、装置及设备 | |
CN111399750A (zh) | 闪存数据写入方法及计算机可读取存储介质 | |
CN111190537B (zh) | 一种追加写场景下顺序存储磁盘管理的方法及系统 | |
US9336250B1 (en) | Systems and methods for efficiently backing up data | |
CN108829345B (zh) | 日志文件的数据处理方法和终端设备 | |
CN114936010B (zh) | 数据处理方法、装置、设备及介质 | |
CN115328851A (zh) | 一种数据保护方法、装置、设备及介质 | |
CN112181275A (zh) | 一种数据处理器及数据处理方法 | |
CN100447758C (zh) | 逻辑磁盘管理器的快照管理方法 | |
CN114936189A (zh) | 应用程序的操作方法、装置、计算机设备和可读存储介质 | |
CN114443339A (zh) | 基于双时间戳循环队列的错误日志记录方法 | |
CN108984432B (zh) | 一种处理io请求的方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20200512 |
|
RJ01 | Rejection of invention patent application after publication |