当前位置:首页 » 硬盘大全 » 海量活动数据缓存
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

海量活动数据缓存

发布时间: 2023-02-10 00:17:49

1. 求解:什么是高速缓存以及缓冲的原理是什么

——》1,高速缓存(Cache),全称“高速缓冲存储器”。

——》2,例如:当CPU处理数据时,它会先到高速缓存中去寻找,如果数据因之前的操作已经读取而被暂存其中,就不需要再从主内存中读取数据——由于CPU的运行速度一般比主内存快,因此若要经常存取主内存的话,就必须等待数个CPU周期从而造成浪费。

——》3,提供“高速缓存”的目的是为了让数据存取的速度适应CPU的处理速度,其基于的原理是内存中“程序执行与数据访问的局域性行为”。

——》4,现在Cache的概念已经被扩充了:不仅在CPU和主内存之间有Cache,而且在内存和硬盘之间也有Cache(磁盘高速缓存),乃至在硬盘与网络之间也有某种意义上的“Cache”(Internet临时文件夹)。

——》5,凡是位于速度相差较大的两种硬件之间的,用于协调两者数据传输速度差异的结构,均可称之为Cache。

——》6,所以硬盘和内存之间的Cache就叫做磁盘高速缓存。它是在内存中开辟一块位置,来临时存取硬盘中的数据。这项技术可使计算机读写时的存储系统平均数据传输率提高5-10倍,适应了当前激增的海量数据存储需求。

——》7,在DOS时代,我们用:
smartdrv 内存容量
命令来加载硬盘高速缓存。自从有了Windows后,我们就不需要加载硬盘高速缓存了,因为Windows本身有自己的高速缓存管理单元,如果强行使用smartdrv命令加载,反而会影响Windows的性能。

——》8,我们在用硬盘安装Win2000/XP时候,系统会提示加载高速缓存,这是因为在安装的初期还是DOS操作,所以为了达到读存的速度,安装程序要求加载高速缓存。

2. 大数据高并发系统架构实战方案(LVS负载均衡、Nginx、共享存储、海量数据、队列缓存)

去51cto网上博客搜索看吧,也有很多类似的书籍

3. 单片机怎么处理海量数据 不要程序回答 我大概知道就是要多路采集 中间有个缓存

用扩充RAM作缓存,,,数据量不大,就用EEPROM作掉电保存,,很大的就用U盘或硬盘作外存.

4. 为什么CPU要分一级缓存、二级缓存和三级缓存

CPU缓存就是CPU内部的缓存运行频率,缓存的大小与结构对CPU速度的影响较大,因此缓存大小也是CPU重要的性能指标之一。

CPU缓存的作用主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾,而缓存的容量要比内存要小的太多,但是其速度要比内存快的多,因此这样会让CPU使用很长的时间等待数据到来或把数据写入内存中。

搜索在缓存中的数据是内存中的一小部分,但这一小部分是短时间内CPU即将访问的,当CPU调用大量数据时,就能够避开内存直接从缓存中调用,从而加快读取速度。

当CPU需要读取数据并进行计算时,首先需要将CPU缓存中查到所需的数据,并在最短的时间下交付给CPU。

如果没有查到所需的数据,CPU就会提出“要求”经过缓存从内存中读取,再原路返回至CPU进行计算。而同时,把这个数据所在的数据也调入缓存,可以使得以后对整块数据的读取都从缓存中进行,不必再调用内存。

一级缓存(L1 Cache)

CPU一级缓存,就是指CPU的第一层级的高速缓存,主要当担的工作是缓存指令和缓存数据。一级缓存的容量与结构对CPU性能影响十分大,但是由于它的结构比较复杂,又考虑到成本等因素,一般来说,CPU的一级缓存较小,通常CPU的一级缓存也就能做到256KB左右的水平。

二级缓存(L2 Cache66)

CPU二级缓存,就是指CPU的第二层级的高速缓存,而二级缓存的容量会直接影响到CPU的性能,二级缓存的容量越大越好。例如intel的第八代i7-8700处理器,共有六个核心数量,而每个核心都拥有256KB的二级缓存,属于各核心独享,这样二级缓存总数就达到了1.5MB。

三级缓存(L3 Cache)

CPU三级缓存,就是指CPU的第三层级的高速缓存,其作用是进一步降低内存的延迟,同时提升海量数据量计算时的性能。和一级缓存、二级缓存不同的是,三级缓存是核心共享的,能够将容量做的很大。

CPU的核心数量、高频高低都会影响性能,但如果让CPU更聪明、更有效率的执行计算任务,那么缓存的作用就至关重要了。

(4)海量活动数据缓存扩展阅读:

CPU主要性能参数:

1、主频

主频也叫时钟频率,单位是兆赫(MHz)或千兆赫(GHz),用来表示CPU的运算、处理数据的速度。

2、外频

外频是CPU的基准频率,单位是MHz。CPU的外频决定着整块主板的运行速度。

3、总线频率

前端总线(FSB)是将CPU连接到北桥芯片的总线。前端总线(FSB)频率(即总线频率)是直接影响CPU与内存直接数据交换速度。

4、倍频系数

倍频系数是指CPU主频与外频之间的相对比例关系。

5、缓存

缓存大小也是CPU的重要指标之一,而且缓存的结构和大小对CPU速度的影响非常大,CPU内缓存的运行频率极高,一般是和处理器同频运作,工作效率远远大于系统内存和硬盘。

5. 如何处理海量数据

在实际的工作环境下,许多人会遇到海量数据这个复杂而艰巨的问题,它的主要难点有以下几个方面:
一、数据量过大,数据中什么情况都可能存在。
如果说有10条数据,那么大不了每条去逐一检查,人为处理,如果有上百条数据,也可以考虑,如果数据上到千万级别,甚至 过亿,那不是手工能解决的了,必须通过工具或者程序进行处理,尤其海量的数据中,什么情况都可能存在,例如,数据中某处格式出了问题,尤其在程序处理时, 前面还能正常处理,突然到了某个地方问题出现了,程序终止了。
二、软硬件要求高,系统资源占用率高。
对海量的数据进行处理,除了好的方法,最重要的就是合理使用工具,合理分配系统资源。一般情况,如果处理的数据过TB级,小型机是要考虑的,普通的机子如果有好的方法可以考虑,不过也必须加大CPU和内存,就象面对着千军万马,光有勇气没有一兵一卒是很难取胜的。
三、要求很高的处理方法和技巧。
这也是本文的写作目的所在,好的处理方法是一位工程师长期工作经验的积累,也是个人的经验的总结。没有通用的处理方法,但有通用的原理和规则。
下面我们来详细介绍一下处理海量数据的经验和技巧:
一、选用优秀的数据库工具
现在的数据库工具厂家比较多,对海量数据的处理对所使用的数据库工具要求比较高,一般使用Oracle或者DB2,微软 公司最近发布的sql Server 2005性能也不错。另外在BI领域:数据库,数据仓库,多维数据库,数据挖掘等相关工具也要进行选择,象好的ETL工具和好的OLAP工具都十分必要, 例如Informatic,Eassbase等。笔者在实际数据分析项目中,对每天6000万条的日志数据进行处理,使用SQL Server 2000需要花费6小时,而使用SQL Server 2005则只需要花费3小时。
二、编写优良的程序代码
处理数据离不开优秀的程序代码,尤其在进行复杂数据处理时,必须使用程序。好的程序代码对数据的处理至关重要,这不仅仅是数据处理准确度的问题,更是数据处理效率的问题。良好的程序代码应该包含好的算法,包含好的处理流程,包含好的效率,包含好的异常处理机制等。
三、对海量数据进行分区操作
对海量数据进行分区操作十分必要,例如针对按年份存取的数据,我们可以按年进行分区,不同的数据库有不同的分区方式,不 过处理机制大体相同。例如SQL Server的数据库分区是将不同的数据存于不同的文件组下,而不同的文件组存于不同的磁盘分区下,这样将数据分散开,减小磁盘I/O,减小了系统负荷, 而且还可以将日志,索引等放于不同的分区下。
四、建立广泛的索引
对海量的数据处理,对大表建立索引是必行的,建立索引要考虑到具体情况,例如针对大表的分组、排序等字段,都要建立相应 索引,一般还可以建立复合索引,对经常插入的表则建立索引时要小心,笔者在处理数据时,曾经在一个ETL流程中,当插入表时,首先删除索引,然后插入完 毕,建立索引,并实施聚合操作,聚合完成后,再次插入前还是删除索引,所以索引要用到好的时机,索引的填充因子和聚集、非聚集索引都要考虑。
五、建立缓存机制
当数据量增加时,一般的处理工具都要考虑到缓存问题。缓存大小设置的好差也关系到数据处理的成败,例如,笔者在处理2亿条数据聚合操作时,缓存设置为100000条/Buffer,这对于这个级别的数据量是可行的。
六、加大虚拟内存
如果系统资源有限,内存提示不足,则可以靠增加虚拟内存来解决。笔者在实际项目中曾经遇到针对18亿条的数据进行处理, 内存为1GB,1个P42.4G的CPU,对这么大的数据量进行聚合操作是有问题的,提示内存不足,那么采用了加大虚拟内存的方法来解决,在6块磁盘分区 上分别建立了6个4096M的磁盘分区,用于虚拟内存,这样虚拟的内存则增加为 4096*6 + 1024 =25600 M,解决了数据处理中的内存不足问题。
七、分批处理
海量数据处理难因为数据量大,那么解决海量数据处理难的问题其中一个技巧是减少数据量。可以对海量数据分批处理,然后处 理后的数据再进行合并操作,这样逐个击破,有利于小数据量的处理,不至于面对大数据量带来的问题,不过这种方法也要因时因势进行,如果不允许拆分数据,还 需要另想办法。不过一般的数据按天、按月、按年等存储的,都可以采用先分后合的方法,对数据进行分开处理。
八、使用临时表和中间表
数据量增加时,处理中要考虑提前汇总。这样做的目的是化整为零,大表变小表,分块处理完成后,再利用一定的规则进行合 并,处理过程中的临时表的使用和中间结果的保存都非常重要,如果对于超海量的数据,大表处理不了,只能拆分为多个小表。如果处理过程中需要多步汇总操作, 可按汇总步骤一步步来,不要一条语句完成,一口气吃掉一个胖子。
九、优化查询SQL语句
在对海量数据进行查询处理过程中,查询的SQL语句的性能对查询效率的影响是非常大的,编写高效优良的SQL脚本和存储 过程是数据库工作人员的职责,也是检验数据库工作人员水平的一个标准,在对SQL语句的编写过程中,例如减少关联,少用或不用游标,设计好高效的数据库表 结构等都十分必要。笔者在工作中试着对1亿行的数据使用游标,运行3个小时没有出结果,这是一定要改用程序处理了。
十、使用文本格式进行处理
对一般的数据处理可以使用数据库,如果对复杂的数据处理,必须借助程序,那么在程序操作数据库和程序操作文本之间选择, 是一定要选择程序操作文本的,原因为:程序操作文本速度快;对文本进行处理不容易出错;文本的存储不受限制等。例如一般的海量的网络日志都是文本格式或者 csv格式(文本格式),对它进行处理牵扯到数据清洗,是要利用程序进行处理的,而不建议导入数据库再做清洗。
十一、定制强大的清洗规则和出错处理机制
海量数据中存在着不一致性,极有可能出现某处的瑕疵。例如,同样的数据中的时间字段,有的可能为非标准的时间,出现的原因可能为应用程序的错误,系统的错误等,这是在进行数据处理时,必须制定强大的数据清洗规则和出错处理机制。
十二、建立视图或者物化视图
视图中的数据来源于基表,对海量数据的处理,可以将数据按一定的规则分散到各个基表中,查询或处理过程中可以基于视图进行,这样分散了磁盘I/O,正如10根绳子吊着一根柱子和一根吊着一根柱子的区别。
十三、避免使用32位机子(极端情况)
目前的计算机很多都是32位的,那么编写的程序对内存的需要便受限制,而很多的海量数据处理是必须大量消耗内存的,这便要求更好性能的机子,其中对位数的限制也十分重要。
十四、考虑操作系统问题
海量数据处理过程中,除了对数据库,处理程序等要求比较高以外,对操作系统的要求也放到了重要的位置,一般是必须使用服务器的,而且对系统的安全性和稳定性等要求也比较高。尤其对操作系统自身的缓存机制,临时空间的处理等问题都需要综合考虑。
十五、使用数据仓库和多维数据库存储
数据量加大是一定要考虑OLAP的,传统的报表可能5、6个小时出来结果,而基于Cube的查询可能只需要几分钟,因此处理海量数据的利器是OLAP多维分析,即建立数据仓库,建立多维数据集,基于多维数据集进行报表展现和数据挖掘等。
十六、使用采样数据,进行数据挖掘
基于海量数据的数据挖掘正在逐步兴起,面对着超海量的数据,一般的挖掘软件或算法往往采用数据抽样的方式进行处理,这样 的误差不会很高,大大提高了处理效率和处理的成功率。一般采样时要注意数据的完整性和,防止过大的偏差。笔者曾经对1亿2千万行的表数据进行采样,抽取出 400万行,经测试软件测试处理的误差为千分之五,客户可以接受。
还有一些方法,需要在不同的情况和场合下运用,例如使用代理键等操作,这样的好处是加快了聚合时间,因为对数值型的聚合比对字符型的聚合快得多。类似的情况需要针对不同的需求进行处理。
海量数据是发展趋势,对数据分析和挖掘也越来越重要,从海量数据中提取有用信息重要而紧迫,这便要求处理要准确,精度要高,而且处理时间要短,得到有价值信息要快,所以,对海量数据的研究很有前途,也很值得进行广泛深入的研究。

6. 如何在海量的数据中取前面100条

<%
'分页sql语句生成代码
Function GetPageSql(TblName,FldName,PageSize,PageIndex,OrderType,StrWhere)
Dim StrTemp,StrSql,StrOrder
'根据排序方式生成相关代码
If OrderType = 0 Then
StrTemp = "> (Select Max([" & FldName & "])"
StrOrder = " Order By [" & FldName & "] Asc"
Else
StrTemp = "< (Select Min([" & FldName & "])"
StrOrder = " Order By [" & FldName & "] Desc"
End If

'若是第1页则无须复杂的语句
If PageIndex = 1 Then
StrTemp = ""
If StrWhere <> "" Then
Strtmp = " Where " & StrWhere
End If
StrSql = "Select Top " & PageSize & " * From [" & TblName & "]" & Strtmp & StrOrder
Else '若不是第1页,构造sql语句
StrSql = "Select Top " & PageSize & " * From [" & TblName & "] Where [" & FldName & "]" & StrTemp & _
" From (Select Top " & (PageIndex-1) * PageSize & " [" & FldName & "] From [" & TblName & "]"
If StrWhere <> "" Then
StrSql = StrSql & " Where " & StrWhere
End If
StrSql = StrSql & StrOrder & ") As Tbltemp)"
If StrWhere <> "" Then
StrSql = StrSql & " And " & StrWhere
End If
StrSql = StrSql & StrOrder
End If
GetPageSql = StrSql '返回sql语句
End Function
%>
分页读取数据,只读取需要显示的数据
如果你用的SQL数据库,用存储过程,需要的话帖上来

除了程序上有要求,需要将WEB服务器和数据库服务器分开

或者把经常使用的数据缓存在内存中,比如使用8GB内存的服务器,将数据库数据全部缓存进去
还有很多技术要加在一起,呵呵

7. 高性能高并发网站架构,教你搭建Redis5缓存集群

一、Redis集群介绍

Redis真的是一个优秀的技术,它是一种key-value形式的NoSQL内存数据库,由ANSI C编写,遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 Redis最大的特性是它会将所有数据都放在内存中,所以读写速度性能非常好。Redis是基于内存进行操作的,性能较高,可以很好的在一定程度上解决网站一瞬间的并发量,例如商品抢购秒杀等活动。

网站承受高并发访问压力的同时,还需要从海量数据中查询出满足条件的数据,需要快速响应,前端发送请求、后端和mysql数据库交互,进行sql查询操作,读写比较慢,这时候引入Redis ,把从mysql 的数据缓存到Redis 中,下次读取时候性能就会提高;当然,它也支持将内存中的数据以快照和日志的形式持久化到硬盘,这样即使在断电、机器故障等异常情况发生时数据也不会丢失,Redis能从硬盘中恢复快照数据到内存中。

Redis 发布了稳定版本的 5.0 版本,放弃 Ruby的集群方式,改用 C语言编写的 redis-cli的方式,是集群的构建方式复杂度大大降低。Redis-Cluster集群采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。

为了保证数据的高可用性,加入了主从模式,一个主节点对应一个或多个从节点,主节点提供数据存取,从节点则是从主节点拉取数据备份,当这个主节点挂掉后,就会有这个从节点选取一个来充当主节点,从而保证集群不会挂掉。

redis-cluster投票:容错,投票过程是集群中所有master参与,如果半数以上master节点与master节点通信超过(cluster-node-timeout),认为当前master节点挂掉。

集群中至少应该有奇数个节点,所以至少有三个节点,每个节点至少有一个备份节点,所以下面使用6节点(主节点、备份节点由redis-cluster集群确定)。6个节点分布在一台机器上,采用三主三从的模式。实际应用中,最好用多台机器,比如说6个节点分布到3台机器上,redis在建立集群时为自动的将主从节点进行不同机器的分配。

二、单机redis模式

下载源码redis5.0并解压编译

wget http://download.redis.io/releases/redis-5.0.0.tar.gz

tar xzf redis-5.0.0.tar.gz

cd redis-5.0.0

make

redis前端启动需要改成后台启动.

修改redis.conf文件,将daemonize no -> daemonize yes

vim redis.conf

启动redis

/www/server/redis/src/redis-server /www/server/redis/redis.conf

查看redis是否在运行

ps aux|grep redis

现在是单机redis模式完成。

三、redis集群模式:

1.创建6个Redis配置文件

cd /usr/local/

mkdir redis_cluster //创建集群目录

cd redis_cluster

mkdir 7000 7001 7002 7003 7004 7005//分别代表6个节点

其对应端口 7000 7001 7002 70037004 7005

2.复制配置文件到各个目录

cp /www/server/redis/redis.conf /usr/local/redis_cluster/7000/

cp /www/server/redis/redis.conf /usr/local/redis_cluster/7001/

cp /www/server/redis/redis.conf /usr/local/redis_cluster/7002/

cp /www/server/redis/redis.conf /usr/local/redis_cluster/7003/

cp /www/server/redis/redis.conf /usr/local/redis_cluster/7004/

cp /www/server/redis/redis.conf /usr/local/redis_cluster/7005/

3.分别修改配置文件

vim /usr/local/redis_cluster/7000/redis.conf

vim /usr/local/redis_cluster/7001/redis.conf

vim /usr/local/redis_cluster/7002/redis.conf

vim /usr/local/redis_cluster/7003/redis.conf

vim /usr/local/redis_cluster/7004/redis.conf

vim /usr/local/redis_cluster/7005/redis.conf

如下

port 7000 #端口

cluster-enabled yes #启用集群模式

cluster-config-file nodes_7000.conf #集群的配置 配置文件首次启动自动生成

cluster-node-timeout 5000 #超时时间 5秒

appendonly yes #aof日志开启 它会每次写操作都记录一条日志

daemonize yes #后台运行

protected-mode no #非保护模式

pidfile /var/run/redis_7000.pid

//下面可以不写

#若设置密码,master和slave需同时配置下面两个参数:

masterauth "jijiji" #连接master的密码

requirepass "jijiji" #自己的密码

cluster-config-file,port,pidfile对应数字

4.启动节点

cd /www/server/redis/src/

./redis-server /usr/local/redis_cluster/7000/redis.conf

./redis-server /usr/local/redis_cluster/7001/redis.conf

./redis-server /usr/local/redis_cluster/7002/redis.conf

./redis-server /usr/local/redis_cluster/7003/redis.conf

./redis-server /usr/local/redis_cluster/7004/redis.conf

./redis-server /usr/local/redis_cluster/7005/redis.conf

查看redis运行

ps aux|grep redis

5.启动集群

/www/server/redis/src/redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1

这里使用的命令是create,因为我们要创建一个新的集群。 该选项--cluster-replicas 1意味着我们希望每个创建的主服务器都有一个从服。

输入yes

至此,Reids5 集群搭建完成。

6.检查Reids5集群状态

可以执行redis-cli --cluster check host:port检查集群状态slots详细分配。

redis-cli --cluster info 127.0.0.1:7000

7.停止Reids5集群

(1).因为Redis可以妥善处理SIGTERM信号,所以直接kill -9也是可以的,可以同时kill多个,然后再依次启动。

kill -9 PID PID PID

(2).redis5 提供了关闭集群的工具,修改文件: /www/server/redis/utils/create-cluster/create-cluster

端口PROT设置为6999,NODES为6,工具会生成 7000-7005 六个节点 用于操作。

修改后,执行如下命令关闭集群:

/www/server/redis/utils/create-cluster/create-cluster stop

重新启动集群:

/www/server/redis/utils/create-cluster/create-cluster start

8.帮助信息

执行redis-cli --cluster help,查看更多帮助信息

redis-cli --cluster help

吉海波

8. 地图缓存使用指南

地图缓存是快速访问地图服务的有效方式。目前流行在线地图服务,如 Google Maps,MapBar,BingMaps 等,对浏览速度和并发性要求都比较高,均采用缓存地图的方式满足快速访问地图的需求。

什么是地图缓存?

作为一种改善地图浏览用户体验的优化策略,地图缓存实际上是包含了一系列比例尺一定地图范围内的地图切片文件。在服务端创建地图缓存之后,客户端的地图操作,比如放大、缩小和平移,都会向服务端发送一个 URL 请求,此时,服务端按照请求返回预先生成的地图切片,从而达到降低服务器负担并快速显示地图,提升地图浏览速度。

为什么使用地图缓存?

使用地图缓存时,只需要付出一次生成缓存的代价,就可以提供给客户端地图显示以快速的响应速度。地图缓存是以一系列不同比例尺下地图图片形式提供的,因此不受普通地图显示上的约束,比如地图信息量的大小、地物的复杂程度、是否带有标注、所使用的地图符号等的限制。因为,一般情况下,地图渲染的细节越多,承载的信息量越丰富,同等环境下,绘制矢量地图就越慢,但使用了地图缓存,客户端在获得了同样显示效果的同时,等待时间却大大缩短。特别是对海量数据,使用缓存可以极大地提高浏览速度,加速地图响应时间,最终提升用户体验。

SuperMap产品针对海量数据,在保证客户端高效访问的前提下,提供了一套完备的二三维缓存体系。SuperMap iDesktop 8C 桌面产品支持生成影像缓存、地形缓存、矢量缓存、模型缓存、地图缓存,还可以对场景直接生成场景缓存。生成的缓存数据可以有多种方式在地图窗口或者场景窗口中加载,也可以部署到服务端进行发布,方便客户端进行浏览。

为了帮助用户深入了解SuperMap 的地图缓存技术、有效使用 SuperMap 产品生成和发布地图缓存等,本专题文档就地图缓存的相关内容进行阐述。

1. 地图缓存的目录结构

地图缓存根据缓存版本的不同,生成的缓存目录的层次结构有所不同。SuperMap iDesktop 7C 桌面应用程序目前支持六种不同版本的地图缓存。

地图缓存的目录结构主要采用 iServer6R,iServer 2.0和 IS .NET 三种缓存策略,按照不同比例尺级别进行分层,都是从指定范围的左上角为起点进行分块。其中2.0,2.1版本的地图缓存均采用 IS .NET 缓存策略,3.0,3.1版本的地图缓存均采用 iServer 2.0 缓存策略,4.0和5.0版本的缓存采用 iServer 6R 缓存策略。

下面就这三种缓存版本的目录结构做详细的介绍。

1.1. iServer 6R 缓存目录结构说明

iServer 6R 是针对 UGC(UniversalGIS Class)系列产品的缓存策略。UGC 系列产品包括桌面产品 SuperMap iDesktop 7C,组件式二次开发平台 SuperMap Objects Java/.NET 6R 以及服务器产品 SuperMapiServer 6R 系列产品。

iServer 6R 缓存策略生成的地图缓存目录共分为六个层次,如下图所示:

图:iServer 6R 缓存目录结构说明

第一层:缓存根目录,用来保存不同缓存文件。缓存根目录名称可以为任意名称。在生成缓存时,通过输入缓存名称来指定。

第二层:地图缓存目录。默认名称格式为:MapName_Width×Height。其中MapName

是地图名称,Width 和 Height 是16进制的图片宽高,例如,目录为世界地图_Day_100×100,表示地图缓存的图片大小为256像素×256像素。

第三层:不同比例尺级别缓存目录。分层目录名称为设置的比例尺大小。如15625000文件夹下保存的是比例尺为15625000时的所有地图切片文件。

第四层:不同空间区域行号缓存目录。目录名称以空间区域(缓存范围)行号命名。所谓空间区域指的是将地图按照网格分块算法将一幅地图分为多个块,每一个分块表示一个空间区域。每个空间区域的宽高都是缓存块的整数倍。区域内至少有一张图片,行号就是空间区域在指定范围内的行数,行号从上到下逐渐增大,用十进制表示。范围扩大时行号可以是负值。

第五层:不同空间区域列号缓存目录。目录名称以空间区域(缓存范围)列号命名。列号就是空间区域在指定范围内的列数,列号从左到右逐渐增大,用十进制表示。范围扩大时列号可以是负值。

第六层:缓存图片文件名称。其格式为:RowxCol_MapHashCode.postfix。其中 Row 表示缓存图片按缓存块划分的行号索引,Col 表示缓存图片按缓存分块划分的列号索引,Row 和 Col 都可以是负数。MapHashCode 表示当前比例尺下地图的16位 HashCode 值,postfix 是缓存图片文件的扩展名。如上图中的名称为 0000×0001_108F8B08FIX.png 的图片,0000为行号,0001为列号,108F8B08FIX 为16位的 HashCode,png 为图片的扩展名。

1.2. IS .NET 缓存目录结构说明

IS .NET 缓存策略是SuperMap 最早使用的缓存策略,也是通过分层分块生成切片文件(影像)的思路进行缓存构建,并且从坐标系、地图、图层风格以及数据范围等方面考虑了缓存更新问题。它主要是 SFC(SuperMap Foundation Class)系列产品采用的缓存策略。

IS .NET 缓存策略生成的二维地图缓存目录共分为五个层次,如下图所示:

第一层:缓存根目录,用来保存不同缓存文件。缓存根目录名称可以为任意名称。在生成缓存时,通过输入缓存名称指定。

第二层:地图缓存目录。默认名称格式为:MapName_Width×Height。其中 MapName 是地图名称,Width 和 Height 是16进制的图片宽高,例如,目录为世界地图_Day_100×100,表示地图缓存的图片大小为256像素×256像素。

第三层:不同比例尺级别缓存目录。分层目录名称为设置的比例尺大小。如15625000文件夹下保存的是比例尺为15625000时的地图切片文件。

第四层:图片索引目录。按照网格分块算法将某一比例尺下的地图切割成多个图幅,每一个图幅在整个地图中都有一个索引值对应,形为:X×Y。X,Y 分别表示图幅在地图分块队列中的列号和行号。

第五层:缓存图片文件名称。其格式为:centerIndex_MapHashCode.postfix,其中centerIndex 表示缓存图片的中心点索引,MapHashCode 表示当前比例尺下地图的 HashCode 值,postfix 是缓存图片文件的扩展名。如上图所示,名称为332×7361_108F8BFIX.png 的图片,(332,7361)表示图片中心点的索引值,108F8BFIX 为当前比例尺下地图的 HashCode 值,png 为图片的后缀名。

1.3. iServer 2.0 缓存目录结构说明

iServer 2.0 缓存策略与 IS .NET缓存策略相似,是 SuperMap iServer 2.0 产品的缓存策略。iServer 2.0 缓存策略生成的二维地图缓存目录共分为五个层次,如下图所示:

图:iServer 2.0缓存目录结构说明

第一层:缓存根目录,用来保存不同缓存文件。缓存根目录名称可以为任意名称。在生成缓存时,通过输入缓存名称指定。

第二层:地图缓存目录,文件夹名称格式为:MapName_Width×Height,其中 Width×Height 按照10进制计算,即目录名称为:地图名称_图片的实际宽×高。

第三层:不同比例尺级别缓存目录。分层目录名称为设置的比例尺大小。如15625000文件夹下保存的是比例尺为15625000时的地图切片文件。

第四层:缓存图片索引目录({Index_x})。将地图分块之后,对每一个图片分别建立索引号。对每一副地图,按照要生成的缓存图片大小生成 M×N 个图片,每一列为 Index_x,x 的值从 0 到 N-1,每一行为 Index_y,y 的值从 0 到 M-1。在这一层,目录名为每一列的索引名,即 Index_x,表示每一列图片缓存的目录。

第五层:缓存图片文件名称。其格式为:Index_y.postfix的值。如上图中选中的文件夹,文件夹5表示 X 索引号(Index_x)为5 ,图片名称15表示 Y 索引号(Index_y)为15,则此图片位于地图目录的第5行第15列。

2. 地图缓存存储类型

SuperMap 缓存有两种存储类型,即原始型与紧凑型。

2.1. 原始型

当缓存储存类型为原始型,切片文件以单独的图片文件格式存放在磁盘上,不对数据进行压缩,能够直接读取。地图缓存数据直观地表现为多个文件夹下的原始图片。

原始型存储方式具有以下特点:

l 可以直接读取,比较直观。

l 占用磁盘空间大,不太易于管理,拷贝和迁移不太方便。

l 对密级较高的数据,不能设置密码。

2.2. 紧凑型

当缓存储存类型为紧凑型时,对原始的切片文件采用一定的压缩和加密机制,在结构上采用一组文件替代原始的图片格式的缓存机制。此时,不同比例尺文件夹下的缓存数据将表现为一组文件,该组文件包括两个部分:索引文件(.sc)、一组数据文件(.sc00和*.lock)。如下图所示,为世界地图_Day 生成的紧凑型缓存文件。

其中,索引文件为 *.sc(SuperMapCache File)格式;数据文件为 *.scXX(SuperMap Caceh File Data)格式,这里的 XX 不是两个字母,是两个16进制数字(00~FF)。目前只支持两位16进制数,所以最多支持256个数据文件。数据文件的个数由缓存数据的大小决定,一个数据文件最大为2G。

与原始型相比,紧凑型存储方式具有以下优势:

3. 使用地图缓存的建议

为了更高效的生成地图缓存,可以从以下几个方面考虑:

3.1. 选择合适的比例尺系列

为了充分利用缓存数据,同时实现多级缩放,可以对地图设置多个比例尺。多设置一些比例尺级别,可以在浏览过程中比较顺畅,不会出现比较大的跳跃。在地图制作的过程中要考虑要素在不同的比例尺下是否需要显示。比如在1:100000的比例尺下,河流是线状的,在1:10000的比例尺下,可能需要讲河流显示为面状的。在小比例尺下,一些注记不需要显示,但随着比例尺的扩大,注记可能需要显示。这种情况下,需要考虑合适的比例尺级别了。

3.2. 缓存路径设置

如果生成的缓存要在 SuperMapiServer Java 6R 服务端发布,可以直接将 SuperMap iDesktop 7C 桌面缓存路径设置为 SueprMap iServer Java 6R 的出图路径下,即 %SuperMapiServer Java_HOME%webappsiserveroutputcache,否则缓存切片拷贝可能会花费比较长的时间。

3.3. 适当的制作地图

制作地图的过程中,可以考虑对线型或者文本对象使用反走样,对过小的对象进行过滤。

对地图中的过小对象使用过滤条件进行过滤,可以在不影响地图所承载的信息量的情况下,将提升地图浏览速度。

进行反走样后矢量地图中的线型和文本看起来更光滑,提高视觉感受,但会造成性能下降。因此在使用反走样时,需要浏览速度和性能之间寻找一种平衡,既要达到浏览效果最佳,也要保证浏览速度。

对比较复杂的地图,要避免对象节点过多,可以考虑进行光滑处理或者重采样。

3.4. 保持工作空间一致

工作空间中的地图参数决定了SuperMap iServer Java 使用的缓存文件中缓存图片的命名,因此需要保证用于制作缓存的工作空间中的地图和用于 SuperMap iServer Java 发布的工作空间中的地图一致。影响参数包括地图的风格、数据的连接情况、图层顺序、默认比例尺、地图范围等。因此制作完成缓存后,尽量不要对工作空间的地图进行修改,以保证发布的地图与用于制作缓存的地图一致。

同时需要保持地图中所有地图可用,所有图层对应的数据集合数据源在工作空间中都存在,不能有无对应数据源和数据集的空连接图层。对数据集中对象的编辑,如添加、删除、更新等,不会影响编辑区域以外的缓存图片(如果需要的话,只需更通过 SuperMap iServer 更新这部分区域的缓存即可)。

3.5. 合理设置地图缓存范围和索引范围

可以为频繁访问的地图区域生成缓存,以降低生成和存储缓存的成本。例如,在访问世界地图时,对于广大的无人区,可以不生成缓存。

用 SuperMap iDesktop7C 生成地图缓存时建议将索引范围设置为发布地图的整幅地图范围,以便与SuperMap iServer Java 缓存索引范围保持一致。在根据需求修改地图缓存的范围信息时,也需要保持索引范围是整幅地图范围。

缓存图片与出图设备无关的特性

利用 SuperMap iDesktop7C 制作地图缓存时,如果 SuperMap iDesktop 7C 所在的计算机与 SuperMap iServer Java 所在的计算机不是同一台机器,有可能由于设备显示地图分辨率不同,从而不同设备上的缓存不能很好地一起使用,例如拼接出现问题等。SuperMap iDesktop 7C 桌面支持配置地图缓存与设备显示分辨率无关。具体的操作方法如下:

3.6. 在 SuperMap iDesktop7C 桌面端生成的地图缓存,如需在 SueprMap iServer Java 服务端发布,需要注意,生成紧凑型地图缓存时,不要对缓存进行加密,即不要设置密码,否则在服务端发布会有问题。