本申请涉及计算机技术领域,具体涉及一种图数据的处理方法,以及一种图数据的处理装置。
背景技术:
图论(graphtheory)是数学的一个分支,以图为研究对象。图论中的图是由若干给定的点及连接两点的线所构成的图形,两顶点之间有边说明这两个顶点有着一定的关系。
图通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有这种关系。这种数据结构和现实有着紧密的联系,很多问题都可以抽象成图的表示,比如快递的路线、人和人之间的关系、商品和商品之间的关系等,因此图在计算机中的应用很广。但是图必须被表示成计算机可理解的数据存储方式之后,才能被利用从而在其上构建出解决问题的算法。
大数据背景下,图的规模往往非常大,内存无法承载,数据库等又不能提供快速的访问,图如何有效的存储是基于图的应用的一大性能瓶颈,特别是当应用需要批量地访问多个顶点的邻接数据时,性能瓶颈尤为突出。
技术实现要素:
鉴于上述问题,提出了本申请以便提供一种克服上述问题或者至少部分地解决上述问题的图数据的处理方法和相应的图数据的处理装置。
依据本申请的一个方面,提供了一种图数据的处理方法,包括:
根据图数据的顶点数据在内存查找对应的数据索引,所述数据索引指示与所述顶点数据连接的邻接数据在磁盘的位置信息,所述邻接数据配置为映射到所述内存;
使用内存指令,按照查找的数据索引在所述磁盘读取所述邻接数据。
可选地,所述方法还包括:
将读取的邻接数据保存至所述内存的数据缓存。
可选地,在所述根据图数据的顶点数据在内存中查找对应的数据索引之前,所述方法还包括:
在所述内存的数据缓存中,查找是否存在所述顶点数据对应的邻接数据,且所查找的结果为不存在。
可选地,在所述根据图数据的顶点数据在内存中查找对应的数据索引之前,所述方法还包括:
将图结构形式的图数据,转换为顶点数据和邻接数据的映射列表,并保存至所述磁盘。
可选地,所述方法还包括:
生成指示所述邻接数据在所述磁盘的位置信息的数据索引,并将所述数据索引保存至内存。
可选地,所述将所述数据索引保存至内存包括:
查找所述内存中是否存在所述邻接数据的数据索引,若存在,则将待存储的数据索引覆盖已存储的数据索引。
可选地,所述方法还包括:
将保存在所述内存的数据索引备份至所述磁盘。
可选地,所述方法还包括:
对所述顶点数据的邻接数据进行更新,并相应更新所述邻接数据对应的数据索引。
可选地,所述方法还包括:
删除所述顶点数据在所述内存的数据缓存。
可选地,所述使用内存指令,按照查找的数据索引在所述磁盘读取所述邻接数据包括:
根据所述数据索引指示的存储位置定位所述磁盘的某个数据区;
按照所述数据索引指示的数据大小和数据名称,从所述数据区提取序列化存储的二进制数据;
提取的二进制数据进行反序列化得到所需邻接数据。
根据本申请的另一个方面提供了一种图数据的处理装置,包括:
索引查找模块,用于根据图数据的顶点数据在内存查找对应的数据索引,所述数据索引指示与所述顶点数据连接的邻接数据在磁盘的位置信息,所述邻接数据配置为映射到所述内存;
邻接数据读取模块,用于使用内存指令,按照查找的数据索引在所述磁盘读取所述邻接数据。
可选地,所述装置还包括:
邻接数据缓存模块,用于将读取的邻接数据保存至所述内存的数据缓存。
可选地,所述装置还包括:
缓存查找模块,用于在所述根据图数据的顶点数据在内存中查找对应的数据索引之前,在所述内存的数据缓存中,查找是否存在所述顶点数据对应的邻接数据,且所查找的结果为不存在。
可选地,所述装置还包括:
图数据转换模块,用于在所述根据图数据的顶点数据在内存中查找对应的数据索引之前,将图结构形式的图数据,转换为顶点数据和邻接数据的映射列表,并保存至所述磁盘。
可选地,所述装置还包括:
索引生成模块,用于生成指示所述邻接数据在所述磁盘的位置信息的数据索引;
索引保存模块,用于将所述数据索引保存至内存。
可选地,所述索引保存模块包括:
索引查找子模块,用于查找所述内存中是否存在所述邻接数据的数据索引,若存在,则执行索引覆盖子模块;
索引覆盖子模块,用于将待存储的数据索引覆盖已存储的数据索引。
可选地,所述装置还包括:
索引备份模块,用于将保存在所述内存的数据索引备份至所述磁盘。
可选地,所述装置还包括:
数据更新模块,用于对所述顶点数据的邻接数据进行更新,并相应更新 所述邻接数据对应的数据索引。
可选地,所述装置还包括:
缓存删除模块,用于删除所述顶点数据在所述内存的数据缓存。
可选地,所述邻接数据读取模块包括:
数据区定位子模块,用于根据所述数据索引指示的存储位置定位所述磁盘的某个数据区;
数据提取子模块,用于按照所述数据索引指示的数据大小和数据名称,从所述数据区提取序列化存储的二进制数据;
数据反序列化子模块,用于提取的二进制数据进行反序列化得到所需邻接数据。
依据本申请实施例,将图数据存储于磁盘中,解决了内存存储能力有限,大规模的图无法完全载入内存,以及内存并非持久存储,导致图数据有丢失的风险的问题。并且由于一般的廉价服务器即可满足本申请的要求,无需采用价格昂贵的大内存的设备,可以大大降低成本。
并且,由于将指示图的邻接数据的位置信息的数据索引存储在内存中,在读取数据时,首先从内存中的数据索引里查找到数据在磁盘中的位置信息,然后根据位置信息读取邻接数据。由于邻接数据配置为映射到内存,即映射到内存中地址空间的区域,相比于传统的磁盘存储方式,可以调用内存指令从磁盘读取邻接数据,不必执行磁盘的i/o操作,提高了数据的读取速度,也因此使得顺序读取多个数据的速度也较快,可以支持快速批量的访问。
上述说明仅是本申请技术方案的概述,为了能够更清楚了解本申请的技术手段,而可依照说明书的内容予以实施,并且为了让本申请的上述和其它目的、特征和优点能够更明显易懂,以下特举本申请的具体实施方式。
附图说明
通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本申请的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
图1示出了根据本申请一个实施例的图数据的处理方法的流程图;
图2示出了根据本申请另一个实施例的图数据的处理方法的流程图;
图3示出了本申请实施例的一个示例中图数据的处理示意图;
图4示出了根据本申请实施例的图数据的处理装置的结构框图。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
参考图1,示出了根据本申请一个实施例的图数据的处理方法的流程图,该方法具体可以包括以下步骤:
步骤101,根据图数据的顶点数据在内存查找对应的数据索引,所述数据索引指示与所述顶点数据连接的邻接数据在磁盘的位置信息,所述邻接数据配置为映射到所述内存。
采用图的形式存储具备连接关系的数据,每条线连接两个顶点数据,顶点数据的邻接数据为与该顶点数据之间具有连线的另一个顶点数据。
本申请实施例将图数据存储于磁盘中,相比于内存存储的方式,解决了机器内存大小有限,大规模的图无法完全载入内存,以及内存并非持久存储,导致图数据有丢失的风险的问题。相比于目前图的研究大都采用高性能、大内存的计算机,相当昂贵,而本申请实施例仅需要一般的廉价服务器即可满足,无需采用价格昂贵的大内存的设备,因此可以大大降低成本。
本申请实施例的数据索引作为提取邻接数据的依据,提供查找邻接数据的线索,可以指示邻接数据在磁盘的位置信息,具体可以由图数据在磁盘的存储位置、图数据的数据大小、数据名称等各种信息中的至少一种组成。
由于访问数据时需要时时的查询数据索引,因此数据索引需要常驻内存,以提高提取数据的效率。在提取邻接数据时,首先根据顶点数据在内存中查找邻接数据的数据索引,进一步根据数据索引提取邻接数据。
本申请实施例中,将邻接数据保存在磁盘,同时将邻接数据配置为映射 到内存,也即是,将邻接数据存储为内存映射文件。通过将邻接数据映射到内存时,可以在内存保留一个地址空间的区域,同时将磁盘提交给此区域,从而实现将磁盘上的物理文件映射到一块连续的内存区域。
当内存映射有大小限制时,数据文件也有大小限制,当一个文件写满了之后,必须新开启一个文件。但是为了读取方便,一条数据是被限制必须存储在单独的数据文件中。
步骤102,使用内存指令,按照查找的数据索引在所述磁盘读取所述邻接数据。
将内存的地址空间映射到磁盘时,处理该地址空间的文件也即是处理磁盘上的文件,因此,在根据数据索引调用邻接数据时,不必再对文件执行磁盘的i/o操作,而是使用内存指令,相比于传统的磁盘存储方式,极大地提高了数据的读取速度,也因此使得顺序读取多个数据的速度也较快,可以支持快速批量的访问。
本申请实施例可以应用在各种对图数据的处理应用中,例如在商品交易引擎中,用于商品关系图在引擎中的存储、访问和计算,可以大大提高处理和交易效率。经过实际应用的性能测试,传统的数据库存储或是磁盘存储的方式,获取单条数据时,速度可以达到最快1ms,但是批量获取数据时,如一次获取40条数据时,即使对批量获取进行优化,但是仍然需要至少20ms左右,而本申请引擎数据读取速度为单线程时,读取速度可以达到0.00856ms/条,50个线程时,读取速度可以达到0.1496ms/条,数据写入速度为单线程时,写入速度可以达到0.01917ms/条,当需要批量读取时,50个线程同时读取,一次读取读取40条数据串行情况下也只需要6ms,并行获取会更快,支持批量访问性能,已经可以满足线上系统的要求。
本申请实施例中,优选地,所述数据索引指示邻接数据的存储位置、数据大小和数据名称,所述使用内存指令,按照查找的数据索引在所述磁盘读取所述邻接数据包括:
子步骤s1,根据所述数据索引指示的存储位置定位所述磁盘的某个数据区;
子步骤s2,按照所述数据索引指示的数据大小和数据名称,从所述数据区提取序列化存储的二进制数据;
子步骤s3,提取的二进制数据进行反序列化得到所需邻接数据。
存储位置指示邻接数据在磁盘存储的某个数据区,首先根据存储位置确定邻接数据对应的数据区,进一步在该数据区根据数据大小和数据名称定位邻接数据。其中,数据大小可以是邻接数据的长度,数据名称可以是邻接数据所存储的文件名称。
本申请实施例中获取的邻接数据若是数据序列化之后的二进制数据,则需要进一步反序列化得到可用的邻接数据。
参考图2,示出了根据本申请一个实施例的图数据的处理方法的流程图,该方法具体可以包括以下步骤:
步骤201,将图结构形式的图数据,转换为顶点数据和邻接数据的映射列表,并保存至所述磁盘。
邻接表是图数据的一种存储方式,即图数据被抽象为顶点和其一级邻接点组成的列表这种k-v结构。如果数据量比较小的情况下,这种k-v数据结构可以在内存中存储和应用,但是大数据量下,图的应用往往会受到图的存储能力的限制,因此,本申请实施例将图数据存储于磁盘中。
步骤202,生成标识所述邻接数据在所述磁盘的位置信息的数据索引,并将所述索引信息保存至所述内存。
对图数据进行存储之后,获取图数据在磁盘的位置信息,并采用数据索引记录所述位置信息,以在查找邻接数据时根据数据索引指示的位置信息提取邻接数据。访问数据时需要时时的查询数据索引,因此数据索引需要常驻内存。
其中,将所述数据索引保存至内存时,可以查找所述内存中是否存在所述邻接数据的数据索引,若存在,则将待存储的数据索引覆盖已存储的数据索引。
步骤203,将保存在所述内存的数据索引备份至所述磁盘。
数据索引是存储引擎提取邻接数据的的重要依据,没有了索引就无法找到存储的邻接数据,因此需要对数据索引进行备份,备份文件为索引文件,内存中的数据索引在某种触发机制下会被备份到磁盘中。当机器宕机时内存中的数据索引会消失,这时重新加载索引文件可以恢复数据索引。
索引备份和容灾可以是异步操作,与写数据并不同时进行。可以通过定时或者使用信号来驱动数据索引的备份。
步骤204,在所述内存的数据缓存中,查找是否存在所述顶点数据对应的邻接数据,且所查找的结果为不存在。
本申请实施例中,可以将已经查找过的邻接数据保存至内存的数据缓存,以备下次提取邻接数据时,首先从缓存中查找是否已有该数据,相比于从磁盘的大量数据文件中查找数据的方式,可以提高获取数据的效率。
步骤205,根据图数据的顶点数据在内存查找对应的数据索引,所述数据索引指示与所述顶点数据连接的邻接数据在磁盘的位置信息,所述邻接数据配置为映射到所述内存。
步骤206,使用内存指令,按照查找的数据索引在所述磁盘读取所述邻接数据。
步骤207,将读取的邻接数据保存至所述内存的数据缓存。
将已读取的邻接数据保存至内存的数据缓存,供下次调用时快读读取,提高数据读取的效率。
步骤208,对所述顶点数据的邻接数据进行更新,并相应更新所述邻接数据对应的数据索引。
本实施例还提供了对邻接数据的更新过程,将待更新节点的新的邻接数据写入数据文件,其中,对于已存在的邻接数据,需要对已存在的数据进行更新,也即是将更新的数据覆盖已存在的数据。
步骤209,删除所述顶点数据在所述内存的数据缓存。
由于磁盘和内存的缓存中均保存有邻接数据,为减少更新时间,本申请在更新图数据的过程中,并不单独对内存的缓存中的数据进行单独更新,针对缓存中待更新的邻接数据进行删除,下次有访问该邻接数据时,会重新从 数据文件中获取,访问者通过感知获取数据的时间加长,可知该邻接数据已经发生更新。
依据本申请实施例,将图数据存储于磁盘中,解决了内存存储能力有限,大规模的图无法完全载入内存,以及内存并非持久存储,导致图数据有丢失的风险的问题。并且由于一般的廉价服务器即可满足本申请的要求,无需采用价格昂贵的大内存的设备,可以大大降低成本。
并且,由于将指示图的邻接数据的位置信息的数据索引存储在内存中,在读取数据时,首先从内存中的数据索引里查找到数据在磁盘中的位置信息,然后根据位置信息读取邻接数据。由于邻接数据配置为映射到内存,即映射到内存中地址空间的区域,相比于传统的磁盘存储方式,可以调用内存指令从磁盘读取邻接数据,不必执行磁盘的i/o操作,提高了数据的读取速度,也因此使得顺序读取多个数据的速度也较快,可以支持快速批量的访问。
综上所述,本申请实施例实现了大规模图数据结构的本地存储、修改和访问、并对图存储引擎进行了性能优化,加速了数据读取速度,同时还实现了图数据的容灾和备份。
为使本领域技术人员更好地理解本申请,以下通过具体的示例对本申请的一种图数据的处理方法进行说明。
参考图3,其示出了本申请实施例的存储引擎架构示意图,具体可以包括:
系统各部分的功能如下:
1、数据文件(datafile)
存储在ssd(固态硬盘)中,用于存储序列化之后的数据,存储图时,数据文件中是顶点对应的邻接数据,存储形式为是内存映射文件。
2、数据索引(index)
存储memory(内存)中,在数据索引存储了如何找到数据的线索,包括数据存储的文件名、数据的位置以及长度。
3、索引文件(indexfile)
索引文件为数据索引的备份。
4、数据缓存(datacache)
已访问过的邻接数据存储在memory(内存)的缓存中,访问者首先查询缓存中是否有自己需要的数据,没有的话再从数据文件中获取。
下面给出根据该存储引擎进行数据处理的过程。
一、图的写入(put)流程:
1、数据准备
将图转换成邻接表这种的k-v数据结构,以满足存储引擎可接受的数据结构。
2、写入数据文件(appenddatatofile)
将邻接表中图的顶点对应的邻接信息写入数据文件,并返回数据的位置、数据的大小和数据存储的文件名称。
3、更新索引
将图顶点对应的邻接数据在数据文件中的位置、大小和文件名称等信息写入存储引擎的索引。如果已经存在此顶点的数据则覆盖,这种方式可以实现图的更新,使用新数据覆盖旧的数据。
4、索引备份/容灾
索引备份和容灾是异步操作,不是写数据时实时进行的。一般可以通过定时或者使用信号来驱动索引的备份。
二、图的读取(get)流程:
1、尝试从缓存获取数据(trytogetfromcache)
首先根据顶点信息查询数据缓存中是否已经存在此顶点对应的数据,如果有,直接从缓存中获取,不需要进行下面的步骤,可大大节省数据访问的时间。
2、查询索引,获取邻接数据的存储位置(readindex)
如果缓存中没有需要的邻接数据,则查询索引,得到邻接数据的存储位置、数据大小和存储数据的文件名称。
3、从数据文件获取数据(getfromdatafile)
找到数据文件,根据数据位置定位到数据,然后根据数据大小获取数据。这时候获取的数据是数据序列化之后的二进制数据,需要反序列化从而得到可用的该顶点的邻接数据。
4、更新缓存(updatecache)
得到数据之后,为了使下次访问更加快速,将此数据写入数据缓存。
5、返回数据
返回获取的该顶点的邻接数据,图的读取结束。
三、图的更新流程:
1、写入新的邻接数据
将待更新节点的新的邻接数据写入数据文件。
2、更新索引
将索引中该顶点的数据索引信息更新为新的信息,覆盖老的索引信息。
3、删除数据缓存中被更新的数据
为了保证图的更新被访问者感知到,需要删除数据缓存中的已经被缓存的该顶点的邻接数据,下次有访问该顶点时,就会重新从数据文件中获取新的数据。
参考图4,其示出了根据本申请实施例的图数据的处理装置的结构框图,具体可以包括:
索引查找模块301,用于根据图数据的顶点数据在内存查找对应的数据索引,所述数据索引指示与所述顶点数据连接的邻接数据在磁盘的位置信息,所述邻接数据配置为映射到所述内存;
邻接数据读取模块302,用于使用内存指令,按照查找的数据索引在所述磁盘读取所述邻接数据。
本申请实施例中,优选地,所述装置还包括:
邻接数据缓存模块,用于将读取的邻接数据保存至所述内存的数据缓存。
本申请实施例中,优选地,所述装置还包括:
缓存查找模块,用于在所述根据图数据的顶点数据在内存中查找对应的 数据索引之前,在所述内存的数据缓存中,查找是否存在所述顶点数据对应的邻接数据,且所查找的结果为不存在。
本申请实施例中,优选地,所述装置还包括:
图数据转换模块,用于在所述根据图数据的顶点数据在内存中查找对应的数据索引之前,将图结构形式的图数据,转换为顶点数据和邻接数据的映射列表,并保存至所述磁盘。
本申请实施例中,优选地,所述装置还包括:
索引生成模块,用于生成指示所述邻接数据在所述磁盘的位置信息的数据索引;
索引保存模块,用于将所述数据索引保存至内存。
本申请实施例中,优选地,所述索引保存模块包括:
索引查找子模块,用于查找所述内存中是否存在所述邻接数据的数据索引,若存在,则执行索引覆盖子模块;
索引覆盖子模块,用于将待存储的数据索引覆盖已存储的数据索引。
本申请实施例中,优选地,所述装置还包括:
索引备份模块,用于将保存在所述内存的数据索引备份至所述磁盘。
本申请实施例中,优选地,所述装置还包括:
数据更新模块,用于对所述顶点数据的邻接数据进行更新,并相应更新所述邻接数据对应的数据索引。
本申请实施例中,优选地,所述装置还包括:
缓存删除模块,用于删除所述顶点数据在所述内存的数据缓存。
本申请实施例中,优选地,所述邻接数据读取模块包括:
数据区定位子模块,用于根据所述数据索引指示的存储位置定位所述磁盘的某个数据区;
数据提取子模块,用于按照所述数据索引指示的数据大小和数据名称,从所述数据区提取序列化存储的二进制数据;
数据反序列化子模块,用于提取的二进制数据进行反序列化得到所需邻接数据。
依据本申请实施例,将图数据存储于磁盘中,解决了内存存储能力有限,大规模的图无法完全载入内存,以及内存并非持久存储,导致图数据有丢失的风险的问题。并且由于一般的廉价服务器即可满足本申请的要求,无需采用价格昂贵的大内存的设备,可以大大降低成本。
并且,由于将指示图的邻接数据的位置信息的数据索引存储在内存中,在读取数据时,首先从内存中的数据索引里查找到数据在磁盘中的位置信息,然后根据位置信息读取邻接数据。由于邻接数据配置为映射到内存,即映射到内存中地址空间的区域,相比于传统的磁盘存储方式,可以调用内存指令从磁盘读取邻接数据,不必执行磁盘的i/o操作,提高了数据的读取速度,也因此使得顺序读取多个数据的速度也较快,可以支持快速批量的访问。
由于所述装置和系统实施例基本相应于前述图1和图2所示的方法实施例,故本实施例的描述中未详尽之处,可以参见前述实施例中的相关说明,在此就不赘述了。
在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本申请也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本申请的内容,并且上面对特定语言所做的描述是为了披露本申请的最佳实施方式。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本申请的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本公开并帮助理解各个申请方面中的一个或多个,在上面对本申请的示例性实施例的描述中,本申请的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本申请要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,申请方面在于少于前面公开的单个实施例的所有特征。因此,遵循 具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本申请的单独实施例。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本申请的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
本申请的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(dsp)来实现根据本申请实施例的图数据的处理设备中的一些或者全部部件的一些或者全部功能。本申请还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本申请的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
应该注意的是上述实施例对本申请进行说明而不是对本申请进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利 要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本申请可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。