任启红
(三江学院 计算机科学与工程学院,江苏 南京 210012)
Linux系统自带的find命令、locate命令、xagrs命令可以用于对文件路径、文件内容进行检索,但速度比较慢从几分钟到几十分钟不等(具体视文件数量、硬盘类型、目录深度等等具体情形而定),如何快速进行文件路径和文件内容检索是一个比较重要的问题。本文提出基于内存建立索引、根据用户实时输入快速检索的计算方法。
使用linux自带的命令find、locate,效率比较低下,需要花费数分钟至数十分钟才能完成检索文献[1]内存文件列表的建立和内存跳表的构建两个功能模块,这两种功能模块都是基于自定义的内存管理方法。先申请固定大小的内存块,里面包括32比特的位图、32个数据块,每一比特的位图依次对应一个数据块,这种方案为每条索引记录分配的内存都相同,比较耗费内存;文献[2]提出把文件系统内生成子目录散列槽,且通过唯一标识符标志每个子目录散列槽并在文件系统内快速接收文件的方法,把业务目录根据业务人员分别配置权限,不过这个比较适用于详细的某行业定制;文献[3]采用把索引存放到数据库进行管理,我们采用把目录、文件路径存放到内存进行检索,速度会更快。
我们采用C语言实现,工具名为Found,开发的系统分为如下几个步骤:
1)读取配置文件(里边有包含目录或排除目录),并解析需要包含的目录列表;
2)根据目录列表递归读取所有文件和所在目录,并存储到内存记为数组pAllFiles;
3)创建两个线程、一个读取键盘输入;一个执行操作(如检索数组、更新索引);
4)按每个路径大小分配内存,并建立索引,内存额外开销比较小;
5)每次输入后进行一次检索,因为计算机处理比键盘操作快约106倍,这样节省了查询的时间;
详细流程图如图1。
图1 系统工程流程图
本软件优点:
1)软件运行中途也可更新检索;
2)字符串比较采用KMP算法,减少检索时比较次数;
3)采用上一次计算的结果更新索引(nextIndex)下一跳索引作为比较输入,减少比较次数:
4)用C语言开发,速度快;
5)实时根据用户输入进行检索速度快;
6)可根据文件删除、新增,手动更新索引列表;
7)基于内存比较,速度快;
8)每个路径+文件名按照实际使用长度申请,浪费的额外内存较少;
9)可支持目录排除建立索引;
图2 每轮搜索更新下一跳示意图
本软件缺点:
1)界面不太友好;
2)建立索引需要时间(Linux下find命令不需要建立索引时间);
3)每次读取一个文件名都需要新申请内存,添加到索引指针数组;
4)开始需要配置申请件数量大小指针数组空间,可能有一些浪费;
5)当前是全量更新索引;
6)更新索引不是自动的;
进行检索时:设置线程睡眠时间为usleep(1000);
测试环境:
处理器:Inter(R) Core(TM) i5-6200 CPU @ 2.30GHz 2.40GHz
内存:8.00GB
主机操作系统Windows10,
使用VMware® Workstation 14 Pro版本:14.1.3 build-9474260
虚拟机操作系统:Ubuntu 20.10测试文件数量:1172814
测试用例及结果,如表1所示:
表1 测试结果
从结果看,Found工具比find命令整体上是快不少。
当前软件由于是纯C实现,界面不太友好,需要进一步完善。