CN107480150A - 一种文件加载方法和装置 - Google Patents
一种文件加载方法和装置 Download PDFInfo
- Publication number
- CN107480150A CN107480150A CN201610399257.8A CN201610399257A CN107480150A CN 107480150 A CN107480150 A CN 107480150A CN 201610399257 A CN201610399257 A CN 201610399257A CN 107480150 A CN107480150 A CN 107480150A
- Authority
- CN
- China
- Prior art keywords
- data
- file
- read
- memory
- 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.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/10—File systems; File servers
- G06F16/18—File system types
- G06F16/182—Distributed file systems
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/10—File systems; File servers
- G06F16/17—Details of further file system functions
- G06F16/172—Caching, prefetching or hoarding of files
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
一种文件加载方法和装置,包括:文件加载装置建立磁盘文件的内存映射文件,从所述内存映射文件中顺序读取数据,且向操作***多次发送预读取通知,每次通知所述操作***将所述磁盘文件中指定位置和指定数据量的数据预读取到所述内存映射文件对应的内存中;文件加载装置按照数据的存储格式,将从所述内存映射文件读取的数据存储到内存最终的数据结构中。所述文件加载装置包括数据加载模块、文件读取模块和内存管理模块模块。本申请的文件加载方法和装置可以提高文件的加载速度,还可以使加载过程中的内存使用量稳定可控。
Description
技术领域
本发明涉及计算机领域,更具体地,涉及一种文件加载方法和装置。
背景技术
在大规模分布式文件***中,为了满足海量客户端的高并发低延迟的访问需求,元数据服务器(Meta Server)通常将所有元数据均存放在内存中,同时通过记录元数据操作日志(operation log)并定期产生元数据内存映像文件(checkpoint file)来实现元数据的持久化存储。元数据内存映像文件通常包含多个数据区(data section)和一个文件头(header)。数据区记录了目录路径树、文件表、数据副本位置等大量元数据,并对其中大块的数据(例如超过4KB)进行了压缩以节省空间;文件头记录了数据区的起始结束信息、压缩参数等。
元数据内存映像文件的快速加载对于提升分布式文件***的可用性和可运维性具有重要意义。当元数据服务器由于软件升级、故障等原因重启时,为了恢复内存中的元数据,需要加载最近产生的一个内存映像文件并重新执行该文件之后的所有操作日志。一方面,元数据内存映像文件的加载步骤是在元数据服务器升级和故障恢复的关键路径之上,缩短加载用时能够直接缩短元数据服务器的升级用时和故障恢复时间;另一方面,大规模场景下元数据服务器的内存映像文件数据量可达数百GB,加载步骤的耗时可占到元数据服务器重启总时间的50%~80%以上,对升级用时和故障恢复时间影响显著。
按照所使用的文件读取方式,现有的文件加载方法可以分为两种:
第一种是基于文件接口的方法:使用文件读取接口(例如C语言的fread函数、Java语言File API)来顺序读取内存映像文件数据然后进行处理,将读取到的元数据存储到相应的内存结构中。在读取线程调用文件读取接口的过程中,文件库(file library)会不断调用操作***的读取函数将数据从磁盘加载到内存中,并拷贝到用户或者库自己的缓冲区(buffer)中。在读取内存映像文件过程中,当遇到压缩过的元数据块时,可以同步的对其进行解压缩然后处理,也可以将数据拷贝到临时的内存缓冲区中然后交给专门的线程来异步解压缩到最终的元数据内存结构中。
这种方法至少存在以下两个影响加载速度的问题:1、文件库内部实现的开销:文件库(例如,glibc file)为了维护内部buffer、保证并发安全等目的,在每次操作时需要进行多项状态值更新和维护工作。当每次读取的数据量很小时(例如,元数据文件中的数据块之间存在很多的四字节的整数),库内部的实现开销在一次读取操作的总开销中的占比将很高,降低了CPU有效利用率,从而降低了数据读取速度。2、内存拷贝开销:当操作***将数据从磁盘读取到***内核内存空间(kernel space)后,文件接口需要一次内存拷贝将数据从内核空间拷贝到读取线程所在的用户内存空间(user space)。在此之后,读取线程才能进一步将这些数据解压缩到最终的元数据内存结构中。虽然内存拷贝较快,但在几百GB的大数据量时耗时明显。
另一种文件加载方法是基于内存映射文件(Memory Mapped File)的方法:将内存映射文件映射到元数据服务器进程地址空间的一段内存区域中,顺序访问该内存区域获得文件数据然后进行处理。此外,也可以告知操作***随后将进行顺序读取,便于***优化数据加载(例如,使用Linux的madvise函数,配合MADV_SEQUENTIAL参数)。在读取线程访问内存的过程中,当访问到尚未从磁盘加载数据的内存地址时,会产生需要访问磁盘的缺页中断(major page fault),必须同步等待操作***从磁盘加载数据;同时,操作***也会异步的不断将尚未访问的文件内容从磁盘预读取(Read-ahead)到内存页缓存(Page Cache)中,以避免随后访问产生缺页中断,而是直接命中页缓存(minor page fault)。
这种方法也存在以下两个问题:1、进程内存占用超限:内存映射文件被访问后,包含相应数据的内存页(Page)即计入到进程的常驻内存之中,导致已经使用完毕的数据也占用了元数据服务器的内存。这部分内存页在***作***清理之前,一方面很可能导致元数据服务器内存超过预定的使用上限,引起元数据服务器被资源限制程序杀死;另一方面,会减少其他进程的可用内存。2、操作***预读不充分:在对内存映射文件顺序访问的过程中,操作***可以提前预读,实现磁盘访问与数据处理的并行。但具体何时预读取、每次预读取多少数据等问题是操作***自己去判断的。操作***从通用性的出发,一次预读取的量并不大,经常不能满足并行处理的需求,导致出现缺页中断,也不利于提高磁盘吞吐率。
对于其他需要将磁盘文件按照相应格式加载到内存数据结构中的应用场景,也存在上述类似的问题。
发明内容
有鉴于此,本发明提供了以下方案。
一种文件加载方法,应用于文件加载装置,包括:
建立磁盘文件的内存映射文件,从所述内存映射文件中顺序读取数据,且向操作***多次发送预读取通知,每次通知所述操作***将所述磁盘文件中指定位置和指定数据量的数据预读取到所述内存映射文件对应的内存中;
按照数据的存储格式,将从所述内存映射文件读取的数据存储到内存最终的数据结构中。
一种文件加载装置,包括数据加载模块、文件读取模块和内存管理模块,其中:
所述数据加载模块,用于不断向所述文件读取模块发起读取请求,按照数据的存储格式,将得到的数据存储到内存最终的数据结构中;
所述文件读取模块,用于建立磁盘文件的内存映射文件,接受所述数据加载模块的读取请求,从所述内存映射文件中顺序读取数据,并触发所述内存管理模块进行内存管理;
所述内存管理模块,用于进行内存管理,所述内存管理包括:向操作***多次发送预读取通知,每次通知所述操作***将所述磁盘文件中指定位置和指定数据量的数据预读取到所述内存映射文件对应的内存中。
上述文件加载方法和装置可以充分利用磁盘和CPU能力,提高文件的加载速度,还可以使加载过程中的内存使用量稳定可控。
附图说明
图1是本发明实施例文件加载方法的流程图;
图2是本发明实施例文件加载装置的模块图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚明白,下文中将结合附图对本发明的实施例进行详细说明。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互任意组合。
本实施例对基于内存映射文件的文件加载方法进行改进,文件加载装置主动对预读取进行管理,将预读取的位置和数据量通知操作***,使操作***预读取数据与文件加载装置读取内存映射文件数据相互适应,从而提高文件的加载速度。
本实施例的文件加载方法如图1所示,包括:
步骤110,建立磁盘文件的内存映射文件,从所述内存映射文件中顺序读取数据,且向操作***多次发送预读取通知,每次通知所述操作***将所述磁盘文件中指定位置和指定数据量的数据预读取到所述内存映射文件对应的内存中;
本实施例中,向操作***多次发送预读取通知是通过预读位置的设定和位置比较来实现的,具体地,文件加载装置从所述内存映射文件中顺序读取数据时,每次数据读取位置到达设定的预读位置时,向所述操作***发送一次预读取通知。因为每次读取的数据大小是变化的,数据读取位置的变化也有大有小,数据读取位置达到设定的预读位置,可以是数据读取位置等于设定的预读位置,也可以是超过设定的预读位置。
本实施例中,所述预读位置按照以下方式逐次设定:每次数据读取位置到达最近一次设定的预读位置时,向所述操作***发送一次预读取通知,并对预读位置进行重新设定,重新设定的预读位置在所述操作***根据此次预读取通知所预读取的数据在所述内存映射文件中的结束位置之前,以保证文件加载装置读取到内存映射文件中的数据,避免产生频繁的缺页中断。预读位置的初始值可以设定为初始的数据读取位置或设定在初始的数据读取位置之前,但就开始读取数据之前的第一次预读取而言,可以不必依赖于上述设定和两个初始位置的对比,直接认为当前的数据读取位置达到预读位置而通知操作***从内存映射文件的起始位置进行预读取。逐次设定的方式可以避免占用过多的资源,但预先设定好所有的预读位置也是可以的。
为了方便实现,上述预读位置、数据读取位置及预读取的数据在所述内存映射文件中的结束位置均可以用偏移值(如这些位置相对于内存映射文件起始位置的偏移值)来表示。要使重新设定的预读位置在预读取的数据在所述内存映射文件中的结束位置之前,涉及到参数的具体设定,有许多具体的实现方式。
本实施例中,所述重新设定的预读位置根据下式确定:Pa=Pb+Ps,其中,Pa为重新设定的预读位置;Pb为所述指定位置,Pb等于当前的数据读取位置或最近一次设定的预读位置;Ps等于所述指定数据量减去指定的预读提前量得到的差。这样可以使重新设定的预读位置在操作***预读取的数据在所述内存映射文件中的结束位置之前且间隔等于或接近指定的预读提前量。
因为当前的数据读取位置到达最近一次设定的预读位置时,两者之间可能有偏差(超出一定的距离),偏差的大小与磁盘文件中数据单元的大小有关,如果偏差较大(如有压缩块),则实际的提前量可能比指定的提前量小的较多。Pb等于当前的数据读取位置,预读提前量可以控制得更为精准,适应于各种文件格式。如果可以满足预读提前量的要求,Pb取值为最近一次设定的预读位置也是可以的。这里需要说明的是,指定数据量和指定位置的信息可以在每次通知中携带,也可以采用默认的方式,这与接口函数的具体实现有关。初始的预读位置可以约定为某一默认值如0,也可携带在通知中。这些具体实现本发明不做任何局限。另外,操作***从指定位置开始预读取数据时,可能有部分数据已经完成预读取,操作***可以判断出来并跳过这些数据。
步骤120,按照数据的存储格式,将从所述内存映射文件读取的数据存储到内存最终的数据结构中。
需要说明的是,步骤110和120描述的处理并不具有必然的先后顺序,这里只是为了表述方便。事实上,将从所述内存映射文件读取的数据存储到内存最终的数据结构,及预读取的处理是并行的。
如果磁盘文件中有压缩块,例如,该磁盘文件是分布式文件***的元数据内存映像文件,则可以根据读取的数据大小分别处理,如下:
每次从所述内存映射文件读取数据后,判断读取的所述数据的数据量是否小于所述磁盘文件压缩块解压后的最小数据量:
如果是,按照数据的存储格式,将读取的所述数据存储到最终的内存数据结构中;
如果否,先以多线程和异步的方式对读取的所述数据进行解压缩,再按照数据的存储格式将解压后的数据存储到最终的内存数据结构中。
为了对已读取数据占用的内存进行及时清理,本实施例的方法还包括:记录最近三次设定的预读位置并不断更新;每次数据读取位置到达最近一次设定的预读位置时,在对预读位置进行重新设定之前,通知所述操作***对最近三次设定的预读位置中前两次设定的预读位置之间的内存区域进行清理。这样,用户可以指定最大内存占用量M,指定数据量可以设定为小于等于M/2+AHEAD的值且大于AHEAD的值,较佳地,将其设定为小于等于M/2+AHEAD且大于等于M/2的值。通过上述设定,可以使内存映射文件在加载过程中实际占用的内存空间不大于M,其中,AHEAD为指定的预读提前量。本实施例中,指定数据量的大小决定了预读位置变化的步长。
本实施例的文件加载装置如图2所示,包括数据加载模块10、文件读取模块20和内存管理模块30,这些模块可以用运行在相应硬件上的软件或硬件电路来实现,其中:
所述数据加载模块10,用于不断向所述文件读取模块发起读取请求,按照数据的存储格式,将得到的数据存储到内存最终的数据结构中;
所述文件读取模块20,用于建立磁盘文件的内存映射文件,接受所述数据加载模块的读取请求,从所述内存映射文件中顺序读取数据,并触发所述内存管理模块进行内存管理;
所述内存管理模块30,用于进行内存管理,所述内存管理包括:向操作***多次发送预读取通知,每次通知所述操作***将所述磁盘文件中指定位置和指定数据量的数据预读取到所述内存映射文件对应的内存中。
可选地,
所述内存管理模块向操作***多次发送预读取通知,包括:从所述内存映射文件中顺序读取数据时,每次数据读取位置到达设定的预读位置时,向所述操作***发送一次预读取通知。
可选地,
所述内存管理模块按照以下方式逐次设定预读位置:
每次数据读取位置到达最近一次设定的预读位置时,向所述操作***发送一次预读取通知,并对预读位置进行重新设定,重新设定的预读位置在所述操作***根据此次预读取通知所预读取的数据在所述内存映射文件中的结束位置之前。
可选地,
所述内存管理模块根据下式确定所述重新设定的预读位置:Pa=Pb+Ps,其中,Pa为重新设定的预读位置;Pb为所述指定位置,Pb等于当前的数据读取位置或最近一次设定的预读位置;Ps等于所述指定数据量减去指定的预读提前量得到的差。
可选地,
所述内存管理模块进行内存管理,还包括:记录最近三次设定的预读位置并不断更新;每次数据读取位置到达最近一次设定的预读位置时,在对预读位置进行重新设定之前,通知所述操作***对最近三次设定的预读位置中前两次设定的预读位置之间的内存区域进行清理。
可选地,
所述指定数据量小于等于M/2+AHEAD且大于等于M/2,其中,M为用户指定的最大内存占用量,AHEAD为用户指定的预读提前量。
可选地,
所述文件加载装置还包括解压缩模块;
所述文件读取模块每次从所述内存映射文件读取数据后,还包括:判断读取的所述数据的数据量是否小于所述磁盘文件压缩块解压后的最小数据量:如果是,将读取的所述数据返回给所述数据加载模块;如果否,将读取的所述数据交给所述解压缩模块处理;
所述解压缩模块用于以多线程和异步的方式对收到的数据进行解压缩,再按照数据的存储格式将解压后的数据存储到最终的内存数据结构中。
可选地,
所述文件加载装置所加载的磁盘文件是分布式文件***的元数据内存映像文件。
下面再用一个应用中的示例对本发明进行说明。
本示例涉及的是分布式文件***中的文件加载装置,需要加载的磁盘文件是分布式文件***的元数据内存映像文件。
本示例的文件加载装置包含元数据加载模块、文件读取模块、内存管理模块和解压缩模块,其中:
元数据加载模块,是加载过程的发起者和控制者,用于不断向文件读取模块发起文件读取请求,按照数据的存储格式,将得到的元数据存储到内存最终的元数据结构中,以实现元数据的恢复。
文件读取模块,用于建立磁盘文件的内存映射文件,接受所述数据加载模块的读取请求,从所述内存映射文件中顺序读取数据,并触发所述内存管理模块进行内存管理。其中,读取的数据返回给元数据加载模块或者交给解压缩模块处理。
解压缩模块,用于以异步方式文件读取模块提交的数据,先对收到的数据进行解压缩,再按照数据的存储格式将解压后的数据存储到最终的内存数据结构中。其中,文件读取模块提交数据时,可以将压缩数据块的内存地址和长度、解压缩后的预期长度、及元数据加载模块提供的元数据内存结构地址(即解压缩的目的地址)提供给解压缩模块。解压缩模块可以直接访问内存地址将数据解压到元数据结构中,不需要额外的用户态内存拷贝;解压缩模块可以包含多个解压缩线程来并行处理,充分利用多核CPU。因此,本示例在读取内存映像文件数据的过程中,当遇到压缩过的元数据块时,可以直接将数据所在的内存地址和长度交给专门的线程来异步解压缩到内存最终的元数据结构中,不需要额外的内存buffer和拷贝。
内存管理模块,用于进行内存管理,所述内存管理包括:向操作***多次发送预读取通知,每次通知所述操作***将所述磁盘文件中指定位置和指定数据量的数据预读取到所述内存映射文件对应的内存中。具体地,本示例的内存管理记录当前的数据读取位置及最近三次设定的预读位置并不断更新,本示例根据与当前数据读取位置的关系,将最近三次设定的预读位置按照设定时间从早到晚的顺序,分别称为下一次待清理的位置、上一次通知预读时的位置和下一次需要通知预读的位置。据此,一方面指导操作***进行无用内存页的清理,控制内存用量;另一方面指导操作***进行充分的磁盘数据预读取,提高磁盘吞吐量。
本示例中,内存管理模块通过一个滑动区间策略来近似控制读取过程中的内存占用量不超过用户指定的一个最大值MSIZE(比如64MB):在顺序读取内存映射文件数据的过程中,以MSIZE/2-AHEAD为步长不断向后滑动一个大小为2(MSIZE/2-AHEAD)的区间;当上一次预读取的MSIZE/2的数据接近要读完时(可以通过指定的预读提前量AHEAD判断,比如只剩下32KB),清理掉较旧的MSIZE/2-AHEAD的内存区间,留下较新的MSIZE/2-AHEAD的内存区间给解压缩模块继续访问,然后再向后预读取MSIZE/2-AHEAD的内存区间。这保证了整个顺序读取过程中,使用的内存量近似于MSIZE;同时,较大的MSIZE给预读取带来了更高的磁盘吞吐量。上述步长也可以设定为MSIZE/2等其他值。
本示例中,内存管理模块根据当前的数据读取位置独立决策,无需记录解压缩模块对内存区间的使用情况,这提高了关键路径上的判断效率,提升了加载速度。由于多线程解压缩速度快,清理较旧的一半内存区间时,相关的解压缩任务极大概率已经完成;即使少量未完成的解压缩任务稍后再次访问已被清理的内存区间,操作***的缺页中断机制也能保证所需数据能够被再次按需加载。
本示例中,文件加载装置加载元数据内存映像文件SFile的过程如下:
步骤一,文件读取模块打开SFile的文件头,获取数据区域位置(偏移量Offset、大小Size)、压缩类型、压缩块最小实际数据量(例如4KB)等信息;依据数据区域位置,建立与内存区域对应的内存映射文件(例如调用Linuxmmap函数);依据压缩类型,初始化解压缩模块;
步骤二,初始化内存管理模块,设置最大内存用量为BUF_SIZE(例如64MB),根据内存映射文件的起始位置设置初始的数据读取位置CurrentPos=Offset,“上一次通知预读的位置”LastMadvise、“下一次需通知预读的位置”NextMadvise和“下一次待清理的位置”ToDrop可以设置为CurrentPos或设置在CurrentPos之前;
步骤三,数据加载模块确认初始化成功后,不断向文件读取模块发送读取请求req。req中可以包含读取的数据量req.size(例如4,读取一个四字节的整数)、读取的目的位置req.dest(例如,读取100字节到某项元数据最终的数据结构地址中);
步骤四,内存管理模块收到一个请求req时,首先判断是否需要实施内存管理操作:如果CurrentPos>=NextMadvise,表示上一次预读的数据已经接近读完,需要进行三部分工作:
(a)内存管理模块通知操作***清理从ToDrop开始的MSIZE/2-AHEAD字节的数据(ToDrop=CurrentPos时无需清理,跳过本步骤)。在Linux上,内存清理使用madvise函数实现,使用MADV_DONTNEED参数值。操作***会异步的较快的清理相应的内存页。即使解压缩模块有极小概率后续访问到已被清理的内存地址,缺页中断机制也会保证数据被再次按需从磁盘读取。
(b)内存管理模块通知操作***进行数据预读取,加载从CurrentPos开始的MSIZE/2字节的文件数据。在Linux上,预读取通知使用madvise函数实现,使用MADV_WILLNEED参数值。加载过程是由操作***异步进行的,加载的数据将进入***Page Cache中。
(c)向后滑动可用内存区间位置,更新状态:ToDrop=LastMadvise,LastMadvise=NextMadvise,NextMadvise=CurrentPos+MSIZE/2–AHEAD。其中,AHEAD(比如32KB)是提前进行预读的提前量,能够保证在上一次预读的数据还没完全读完时即开始下一次预读,使得上一次数据真正读完时已经有部分新的数据预读完毕,从而避免两次预读之间出现前述等待磁盘的major page fault。
步骤五、内存管理操作完毕后,文件读取模块有两种情况:
(a)如果req.size大于压缩块解压后最小数据量,证明是一块需要解压缩的数据,则读出压缩块大小,连同req.size(即解压后大小)、目的地址、当前位置生成一个解压缩任务,交给解压缩模块处理,然后更新CurrentPos=CurrentPos+压缩块大小,最后告诉加载模块已异步处理,加载模块可以继续;
(b)如果请求数据量小于压缩块解压后最小数据量,则直接从当前位置读取所需数据,转换为所需数据类型后返回给加载模块,并更新CurrentPos=CurrentPos+req.size。
步骤六,数据加载模块返回步骤三继续执行,直到加载完毕。
步骤七,数据加载模块读取所有文件数据后,等待解压缩模块完成所有的解压缩任务,然后通知文件加载模块释放内存映射文件(例如调用Linux的munmap函数),清理环境。至此,元数据映像文件加载完成。
在具体实现中,上述偏移量Offset、大小Size等各参数在用于Linux mmap和madvise等函数时,会进行内存页对齐处理(page alignment)。在读取文件结尾的数据时,可以调整上述参数的值以避免超出文件的结尾部分。
可以看到,本示例的上述流程中通过主动管理操作***预读取、高效的内存管理操作时机判断、异步多线程解压缩,让耗时的解压缩和磁盘读取操作与文件读取关键路径充分并行,提高了磁盘和CPU的有效利用率,加快了加载速度。同时,通过合理控制预读和内存清理的时机、位置和数量,将内存总用量维持在一个指定的最大值附近,避免了内存超限。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明实施例的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (16)
1.一种文件加载方法,应用于文件加载装置,包括:
建立磁盘文件的内存映射文件,从所述内存映射文件中顺序读取数据,且向操作***多次发送预读取通知,每次通知所述操作***将所述磁盘文件中指定位置和指定数据量的数据预读取到所述内存映射文件对应的内存中;
按照数据的存储格式,将从所述内存映射文件读取的数据存储到内存最终的数据结构中。
2.如权利要求1所述的方法,包括:
所述向操作***多次发送预读取通知,包括:
从所述内存映射文件中顺序读取数据时,每次数据读取位置到达设定的预读位置时,向所述操作***发送一次预读取通知。
3.如权利要求2所述的方法,包括:
所述预读位置按照以下方式逐次设定:
每次数据读取位置到达最近一次设定的预读位置时,向所述操作***发送一次预读取通知,并对预读位置进行重新设定,重新设定的预读位置在所述操作***根据此次预读取通知所预读取的数据在所述内存映射文件中的结束位置之前。
4.如权利要求3所述的方法,包括:
所述重新设定的预读位置根据下式确定:
Pa=Pb+Ps
其中,Pa为重新设定的预读位置;Pb为所述指定位置,Pb等于当前的数据读取位置或最近一次设定的预读位置;Ps等于所述指定数据量减去指定的预读提前量得到的差。
5.如权利要求3或4所述的方法,包括:
所述方法还包括:
记录最近三次设定的预读位置并不断更新;每次数据读取位置到达最近一次设定的预读位置时,在对预读位置进行重新设定之前,通知所述操作***对最近三次设定的预读位置中前两次设定的预读位置之间的内存区域进行清理。
6.如权利要求1-4中任一所述的方法,包括:
所述指定数据量小于等于M/2+AHEAD且大于等于M/2,其中,M为用户指定的最大内存占用量,AHEAD为用户指定的预读提前量。
7.如权利要求1-4中任一所述的方法,其特征在于:
按照数据的存储格式,将从所述内存映射文件读取的数据存储到内存最终的数据结构中,包括:
每次从所述内存映射文件读取数据后,判断读取的所述数据的数据量是否小于所述磁盘文件压缩块解压后的最小数据量:
如果是,按照数据的存储格式,将读取的所述数据存储到最终的内存数据结构中;
如果否,先以多线程和异步的方式对读取的所述数据进行解压缩,再按照数据的存储格式将解压后的数据存储到最终的内存数据结构中。
8.如权利要求1-4中任一所述的方法,其特征在于:
所述磁盘文件是分布式文件***的元数据内存映像文件。
9.一种文件加载装置,其特征在于,包括数据加载模块、文件读取模块和内存管理模块,其中:
所述数据加载模块,用于不断向所述文件读取模块发起读取请求,按照数据的存储格式,将得到的数据存储到内存最终的数据结构中;
所述文件读取模块,用于建立磁盘文件的内存映射文件,接受所述数据加载模块的读取请求,从所述内存映射文件中顺序读取数据,并触发所述内存管理模块进行内存管理;
所述内存管理模块,用于进行内存管理,所述内存管理包括:向操作***多次发送预读取通知,每次通知所述操作***将所述磁盘文件中指定位置和指定数据量的数据预读取到所述内存映射文件对应的内存中。
10.如权利要求9所述的装置,其特征在于:
所述内存管理模块向操作***多次发送预读取通知,包括:从所述内存映射文件中顺序读取数据时,每次数据读取位置到达设定的预读位置时,向所述操作***发送一次预读取通知。
11.如权利要求10所述的装置,其特征在于:
所述内存管理模块按照以下方式逐次设定预读位置:
每次数据读取位置到达最近一次设定的预读位置时,向所述操作***发送一次预读取通知,并对预读位置进行重新设定,重新设定的预读位置在所述操作***根据此次预读取通知所预读取的数据在所述内存映射文件中的结束位置之前。
12.如权利要求11所述的装置,其特征在于:
所述内存管理模块根据下式确定所述重新设定的预读位置:Pa=Pb+Ps,其中,Pa为重新设定的预读位置;Pb为所述指定位置,Pb等于当前的数据读取位置或最近一次设定的预读位置;Ps等于所述指定数据量减去指定的预读提前量得到的差。
13.如权利要求11或12所述的装置,其特征在于:
所述内存管理模块进行内存管理,还包括:记录最近三次设定的预读位置并不断更新;每次数据读取位置到达最近一次设定的预读位置时,在对预读位置进行重新设定之前,通知所述操作***对最近三次设定的预读位置中前两次设定的预读位置之间的内存区域进行清理。
14.如权利要求9-12任一所述的装置,其特征在于:
所述指定数据量小于等于M/2+AHEAD且大于等于M/2,其中,M为用户指定的最大内存占用量,AHEAD为用户指定的预读提前量。
15.如权利要求9-12任一所述的装置,其特征在于:
所述文件加载装置还包括解压缩模块;
所述文件读取模块每次从所述内存映射文件读取数据后,还包括:判断读取的所述数据的数据量是否小于所述磁盘文件压缩块解压后的最小数据量:如果是,将读取的所述数据返回给所述数据加载模块;如果否,将读取的所述数据交给所述解压缩模块处理;
所述解压缩模块用于以多线程和异步的方式对收到的数据进行解压缩,再按照数据的存储格式将解压后的数据存储到最终的内存数据结构中。
16.如权利要求9-12任一所述的装置,其特征在于:
所述文件加载装置所加载的磁盘文件是分布式文件***的元数据内存映像文件。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610399257.8A CN107480150B (zh) | 2016-06-07 | 2016-06-07 | 一种文件加载方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610399257.8A CN107480150B (zh) | 2016-06-07 | 2016-06-07 | 一种文件加载方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107480150A true CN107480150A (zh) | 2017-12-15 |
CN107480150B CN107480150B (zh) | 2020-12-08 |
Family
ID=60594157
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610399257.8A Active CN107480150B (zh) | 2016-06-07 | 2016-06-07 | 一种文件加载方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107480150B (zh) |
Cited By (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108628550A (zh) * | 2018-04-28 | 2018-10-09 | 深信服科技股份有限公司 | 一种读取磁盘映射文件的方法、装置及*** |
CN108763104A (zh) * | 2018-05-23 | 2018-11-06 | 北京小米移动软件有限公司 | 预读取文件页的方法、装置及存储介质 |
CN109189480A (zh) * | 2018-07-02 | 2019-01-11 | 新华三技术有限公司成都分公司 | 文件***启动方法及装置 |
CN109542361A (zh) * | 2018-12-04 | 2019-03-29 | 郑州云海信息技术有限公司 | 一种分布式存储***文件读取方法、***及相关装置 |
CN109656892A (zh) * | 2018-12-26 | 2019-04-19 | 上海百事通信息技术股份有限公司 | 一种文件在线解压缩方法 |
CN110008016A (zh) * | 2019-04-15 | 2019-07-12 | 深圳市万普拉斯科技有限公司 | 匿名页面管理方法、装置、终端设备及可读存储介质 |
CN111770054A (zh) * | 2020-05-28 | 2020-10-13 | 苏州浪潮智能科技有限公司 | 一种针对smb协议读请求的交互加速方法与*** |
CN113760192A (zh) * | 2021-08-31 | 2021-12-07 | 荣耀终端有限公司 | 数据读取方法、装置、存储介质和程序产品 |
CN113760191A (zh) * | 2021-08-31 | 2021-12-07 | 荣耀终端有限公司 | 数据读取方法、装置、存储介质和程序产品 |
CN113986838A (zh) * | 2021-12-28 | 2022-01-28 | 成都云祺科技有限公司 | 基于文件***的海量小文件处理方法、***及存储介质 |
CN114461589A (zh) * | 2021-08-24 | 2022-05-10 | 荣耀终端有限公司 | 读取压缩文件的方法、文件***及电子设备 |
US11379420B2 (en) | 2019-03-08 | 2022-07-05 | Nvidia Corporation | Decompression techniques for processing compressed data suitable for artificial neural networks |
CN115495794A (zh) * | 2022-11-17 | 2022-12-20 | 北京华云安信息技术有限公司 | 一种基于无文件技术的反解析文件保护方法和装置 |
Citations (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP3204323B2 (ja) * | 1991-07-05 | 2001-09-04 | エヌイーシーマイクロシステム株式会社 | キャッシュメモリ内蔵マイクロプロセッサ |
CN101315595A (zh) * | 2008-06-30 | 2008-12-03 | 华为技术有限公司 | 一种数据读取方法及装置 |
CN101814038A (zh) * | 2010-03-23 | 2010-08-25 | 杭州顺网科技股份有限公司 | 一种加快计算机启动速度的方法 |
CN102483949A (zh) * | 2009-08-31 | 2012-05-30 | 桑迪士克以色列有限公司 | 预加载数据到快闪存储装置中 |
CN102707966A (zh) * | 2012-04-12 | 2012-10-03 | 腾讯科技(深圳)有限公司 | 加速操作***启动的方法及装置、预取信息生成方法及装置和终端 |
CN102750174A (zh) * | 2012-06-29 | 2012-10-24 | Tcl集团股份有限公司 | 文件加载方法及装置 |
CN102799456A (zh) * | 2012-07-24 | 2012-11-28 | 上海晨思电子科技有限公司 | 一种游戏引擎加载资源文件的方法、装置和计算机 |
CN103856567A (zh) * | 2014-03-26 | 2014-06-11 | 西安电子科技大学 | 基于Hadoop分布式文件***的小文件存储方法 |
WO2014138498A1 (en) * | 2013-03-06 | 2014-09-12 | Recupero Gregory | Improved client spatial locality through the use of virtual request trackers |
CN105487987A (zh) * | 2015-11-20 | 2016-04-13 | 深圳市迪菲特科技股份有限公司 | 一种处理并发顺序读io的方法及装置 |
-
2016
- 2016-06-07 CN CN201610399257.8A patent/CN107480150B/zh active Active
Patent Citations (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP3204323B2 (ja) * | 1991-07-05 | 2001-09-04 | エヌイーシーマイクロシステム株式会社 | キャッシュメモリ内蔵マイクロプロセッサ |
CN101315595A (zh) * | 2008-06-30 | 2008-12-03 | 华为技术有限公司 | 一种数据读取方法及装置 |
CN102483949A (zh) * | 2009-08-31 | 2012-05-30 | 桑迪士克以色列有限公司 | 预加载数据到快闪存储装置中 |
CN101814038A (zh) * | 2010-03-23 | 2010-08-25 | 杭州顺网科技股份有限公司 | 一种加快计算机启动速度的方法 |
CN102707966A (zh) * | 2012-04-12 | 2012-10-03 | 腾讯科技(深圳)有限公司 | 加速操作***启动的方法及装置、预取信息生成方法及装置和终端 |
CN102750174A (zh) * | 2012-06-29 | 2012-10-24 | Tcl集团股份有限公司 | 文件加载方法及装置 |
CN102799456A (zh) * | 2012-07-24 | 2012-11-28 | 上海晨思电子科技有限公司 | 一种游戏引擎加载资源文件的方法、装置和计算机 |
WO2014138498A1 (en) * | 2013-03-06 | 2014-09-12 | Recupero Gregory | Improved client spatial locality through the use of virtual request trackers |
CN103856567A (zh) * | 2014-03-26 | 2014-06-11 | 西安电子科技大学 | 基于Hadoop分布式文件***的小文件存储方法 |
CN105487987A (zh) * | 2015-11-20 | 2016-04-13 | 深圳市迪菲特科技股份有限公司 | 一种处理并发顺序读io的方法及装置 |
Cited By (19)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108628550B (zh) * | 2018-04-28 | 2022-02-22 | 深信服科技股份有限公司 | 一种读取磁盘映射文件的方法、装置及*** |
CN108628550A (zh) * | 2018-04-28 | 2018-10-09 | 深信服科技股份有限公司 | 一种读取磁盘映射文件的方法、装置及*** |
CN108763104A (zh) * | 2018-05-23 | 2018-11-06 | 北京小米移动软件有限公司 | 预读取文件页的方法、装置及存储介质 |
CN109189480A (zh) * | 2018-07-02 | 2019-01-11 | 新华三技术有限公司成都分公司 | 文件***启动方法及装置 |
CN109189480B (zh) * | 2018-07-02 | 2021-11-09 | 新华三技术有限公司成都分公司 | 文件***启动方法及装置 |
CN109542361A (zh) * | 2018-12-04 | 2019-03-29 | 郑州云海信息技术有限公司 | 一种分布式存储***文件读取方法、***及相关装置 |
CN109542361B (zh) * | 2018-12-04 | 2022-06-07 | 郑州云海信息技术有限公司 | 一种分布式存储***文件读取方法、***及相关装置 |
CN109656892A (zh) * | 2018-12-26 | 2019-04-19 | 上海百事通信息技术股份有限公司 | 一种文件在线解压缩方法 |
US11379420B2 (en) | 2019-03-08 | 2022-07-05 | Nvidia Corporation | Decompression techniques for processing compressed data suitable for artificial neural networks |
CN110008016A (zh) * | 2019-04-15 | 2019-07-12 | 深圳市万普拉斯科技有限公司 | 匿名页面管理方法、装置、终端设备及可读存储介质 |
CN111770054A (zh) * | 2020-05-28 | 2020-10-13 | 苏州浪潮智能科技有限公司 | 一种针对smb协议读请求的交互加速方法与*** |
CN114461589A (zh) * | 2021-08-24 | 2022-05-10 | 荣耀终端有限公司 | 读取压缩文件的方法、文件***及电子设备 |
CN113760191A (zh) * | 2021-08-31 | 2021-12-07 | 荣耀终端有限公司 | 数据读取方法、装置、存储介质和程序产品 |
CN113760192A (zh) * | 2021-08-31 | 2021-12-07 | 荣耀终端有限公司 | 数据读取方法、装置、存储介质和程序产品 |
CN113760192B (zh) * | 2021-08-31 | 2022-09-02 | 荣耀终端有限公司 | 数据读取方法、装置、存储介质和程序产品 |
CN113760191B (zh) * | 2021-08-31 | 2022-09-23 | 荣耀终端有限公司 | 数据读取方法、装置、存储介质和程序产品 |
CN113986838A (zh) * | 2021-12-28 | 2022-01-28 | 成都云祺科技有限公司 | 基于文件***的海量小文件处理方法、***及存储介质 |
CN115495794A (zh) * | 2022-11-17 | 2022-12-20 | 北京华云安信息技术有限公司 | 一种基于无文件技术的反解析文件保护方法和装置 |
CN115495794B (zh) * | 2022-11-17 | 2024-06-14 | 北京华云安信息技术有限公司 | 一种基于无文件技术的反解析文件保护方法和装置 |
Also Published As
Publication number | Publication date |
---|---|
CN107480150B (zh) | 2020-12-08 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107480150A (zh) | 一种文件加载方法和装置 | |
CN102047305B (zh) | 文件输入/输出调度器及其处理方法 | |
CN106897411A (zh) | 基于Spark技术的ETL***及其方法 | |
CN102693388B (zh) | 数据安全防护处理***及方法及存储介质 | |
US11245774B2 (en) | Cache storage for streaming data | |
JP2004192292A (ja) | プリフェッチアプライアンスサーバ | |
CN103123595A (zh) | 使用即时数据分块的文件输入/输出调度 | |
CN103412884B (zh) | 一种异构存储介质下嵌入式数据库的管理方法 | |
CN104281528A (zh) | 一种数据存储方法及装置 | |
US20230333764A1 (en) | Method and apparatus for compressing data of storage system, device, and readable storage medium | |
JP2015179328A (ja) | データ転送装置、データ受信システムおよびデータ受信方法 | |
US10592148B2 (en) | Information processing system, storage control apparatus, storage control method, and storage control program for evaluating access performance to a storage medium | |
EP3963853B1 (en) | Optimizing storage and retrieval of compressed data | |
US20150006493A1 (en) | Managing a binary object in a database system | |
CN104572505A (zh) | 一种保证海量数据缓存最终一致性的***及方法 | |
CN105022741A (zh) | 压缩方法和***以及云存储方法和*** | |
JP5444728B2 (ja) | ストレージシステム、ストレージシステムにおけるデータ書込方法及びデータ書込プログラム | |
JP2023155450A5 (ja) | 計算機システム及び計算機システムの制御方法 | |
CN110445580B (zh) | 数据发送方法及装置、存储介质、电子装置 | |
US20170344578A1 (en) | Compressed data layout for optimizing data transactions | |
US11593310B2 (en) | Providing writable streams for external data sources | |
CN110413689A (zh) | 一种内存数据库的多节点数据同步方法与装置 | |
US11829262B2 (en) | File restore performance using a file handler to disassociate prefetch and read streams | |
CN108920542A (zh) | 一种分布式内存大数据处理***及其数据处理方法 | |
CN114546891A (zh) | 一种缓存缩容方法、装置、设备及存储介质 |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |