地区配置文件的优化

前些阵子写过一个针对地区配置文件的优化,今天有同事提起,特写下来共同交流!
问题描述:部分应用需要展示多个企业的地区信息,但从数据库或缓存读到的是一堆地区ID,无法直接显示,需要读地区配置文件将ID转换为地区名; 而地区配置(area.php)文件较大(122K),每次载入文件会耗费7ms左右时间(正常SQL读数据库才耗费不到1ms时间,这个耗费5ms,简直无法忍受)
解决办法:将地区配置的php文件转换为纯文本文件,每次只读需要的行,不用读全部行;时间复杂度为:O(1)
使用到的函数: fopen,fseek, fread
具体的实现过程:
第一步:将地区配置文件转换为文本文件
   1:将省、市、区的关联数组补全,如市的数组为:

array(‘1‘ => ‘上海市‘, ‘3‘ => ‘北京市‘, ‘4‘ => ‘郑州‘)

补全后变为:

array(‘1‘ => ‘上海市‘, ‘2‘ => ‘‘, ‘3‘ => ‘北京市‘, ‘4‘ => ‘郑州‘)

 2:将省市区的名称依次写入文本、一行一个
        书写的格式:

行号   省、市、区名
1            北京
2            上海
3            天津
4            重庆
5            香港
.             .
.             .
.             .
35          上海
36
37          北京
38          郑州
.            .
.            .
753      ID为1的县名称
754      ID为2的县名称
755      ID为3的县名称
.           .
.           .
.           .

  此时省、市、区的ID与行号就会有如下的关联:

省:lineid = ID
市:lineid = ID + 34
区:lineid = ID + 34 + 718

  至此,我们可以根据一个省、市、区的ID获取一个行号,然后用fread读这一行就可以获取到想要的结果;

第二步:优化第一步结构,并从文本中读数据
     完成第一步之后,就开始翻手册来查找读文件指定行内容的函数,找了很久,遗憾的发现竟然没有这个函数,那真是万念俱灰呀,又瞎搞了。
      一袋烟功夫后,终于想明白了,文件嘛,肯定是存磁盘的,你让它读第100行的内容,它也不知道100行的磁盘"偏移量"是多少,不能一下子读出来也是理所当然;至此,突然恍然大悟,如果第100行的磁盘“偏移量”是固定值,那么直接读出来应该不是问题。哈,很简单嘛,把每行的字节数设为固定值(假设每行48个字节,不足48的填空白字符),第N行的“偏移量”也就固定了。如:读100行的的内容,直接用fseek函数将文件内部指针移动到100 * 48位置,然后用fread函数读一行内容即可。
      功能已基本搞定;使用到的函数有:fopen,fseek,fread;

第三步:程序的几点优化

    字符写文件时,使用pack函数将字符转为固定字节长度;对每行写入的内容优化:省名称行不变,市名称行除存储市名称外追加所属省的信息,县名称行追加市、省信息;此时,省名称行固定长度48字节,市行固定长度96,区行固定长度144;将省、市、区各部分每行的长度,省、市、区的数量信息存到文件的第一行;查询的类使用单例模式,对查询过的ID存储防止重复查询;

文件存储格式变为:

0       第一行存储基本信息,如省的数量,省名称每行占的字节数等;
1       北京*******
2       上海*******
3       天津*******
4       重庆*******
5       香港*******
.           .
.           .
.           .
35      上海,上海*****************
36      *************************
37      北京,北京*****************
38      郑州,河南*****************
.        .
.        .
.        .
753     ID为1的县名称,ID为1县所在市,所在省名称***********
754     ID为2的县名称,ID为2县所在市,所在省名称***********
755     ID为3的县名称,ID为3县所在市,所在省名称***********
.        .
.        .
.        .

  

性能测试
代码:

<?php
include"Area.php";
//随机生成20个ID
for($i = 1; $i < 20000; $i++) {
        $id[] = rand(1,3000);
}
$stime = microtime(true);
foreach($id as $v) {
        $info = Xz_Area::getInstance()->getAreaNav($v, ‘area‘);
}
$etime = microtime(true);
echo "\n spend time:". (($etime - $stime) * 1000)."ms\n";

结果:普通硬盘平均执行时间为0.5ms; Ssd盘平均执行时间在0.3ms以内

时间: 2024-10-13 06:16:07

地区配置文件的优化的相关文章

mysql修改配置文件进行优化

基本是通过内存大小来选择mysql的配置文件的,那有博友会说了,现在的服务器动不动就是32G内存或者64G内存,甚至更大的内存,你那个配置文件最大只支持4G内存是不是有点小了,确认会有这样的问题,从mysql5.6以后,为了更大的发挥mysql的性能,已经去除了配置文件选择,只有一个默认的配置文件,里面只有一些基本配置,所有设置管理员都可以根据自己实际的需求进行自行设置,好了说了这么多,我们就来说一说,在企业的用的最多的my-innodb-heavy-4G.cnf配置文件! 二.详解 my-in

apache配置文件参数优化

1.CentOS5.8 x86_64位 采用最小化安装,系统经过了基本优化篇2.apache版本:httpd-2.2.293.源码包存放位置:/home/oldboy/tools4.源码包编译安装位置:/application/ 一.设置日志轮循    1.下载并安装cronolog [[email protected] tools]# cd /home/oldboy/tools    [[email protected] tools]# wget http://cronolog.org/dow

Nginx配置文件的优化

Nginx配置文件中需要优化的参数为以下几项: worker_processes 8; Nginx配置文件进程数,可以按照cpu数目来指定,一般为它的倍数. worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000; 为每个进程指定一个cpu,上例中将8个进程分配到8个cpu,也可以将一个进程分配到多个cpu. worker_rlimit_nofile 102400; N

mongodb系列~配置文件的优化与处理

一 简介:讲讲如何优化mongo配置文件二 常规参数     port= //端口     fork=true//守护进程方式启动mongo     logpath=shard.log //mongo日志存放路径     journal= true//redo log开启     nohttpinterface = true //关闭http端口,提高安全性     directoryperdb = true // 每个db会创建一个单独的目录     logappend = true //日志

Nginx配置文件参数优化和内核参数优化

一.Nginx配置文件优化 worker_processes auto; nginx 进程数,建议按照cpu 数目来指定,但是也可以直接指定为auto. worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000; 为每个进程分配cpu,上例中将8 个进程分配到8 个cpu,当然可以写多个,或者将一个进程分配到多个cpu.参考:https://blog.csdn.net/u

Nginx配置文件、优化详解

上篇<编译安装nginx>已将nginx安装好,这篇写nginx配置文件和部分优化参数. 查看nginx的配置文件路径,可以使用nginx配置文件检查命令nginx -t: 1 [[email protected] ~]# nginx -t 2 nginx: the configuration file /etc/nginx/nginx.conf syntax is ok #编译安装后的nginx配置文件路径3 nginx: configuration file /etc/nginx/ngin

php-fpm配置文件的优化

php-fpm中比较重要的两项参数是:request_terminate_timeoutpm.max_children request_terminate_timeout该值决定了php-fpm进程的连接读取和发送,如果将该值设置的过小,将会出现502或504错误,该指令默认为0,就是不启用. 以下内容来自:http://www.linuxde.net/2013/06/14638.html pm表示使用那种方式,就是static(静态)或者dynamic(动态).在更老一些的版本中,dynami

my.cnf 配置文件参数优化

2017-09-23 ### AUTHOR: NashCen ### DATE: 2017/09/23 ### REV: 2.0 [client] ######################################################################### # # # MySQL客户端配置 # # # ######################################################################### port

Nginx配置文件优化详解

Nginx配置文件优化详解 对nginx进行优化是重点也是难点,这里给出一些常用的优化措施,以及相关参数的所代表的意思.有些参数需要结合公司服务器进行设置. 全局变量的优化: #定义Nginx运行的用户和用户组user  www  www: #启动进程,通常设置成和cpu的数量相等 worker_processes  8: #为每个进程分配cpu. worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000