需求背景:应客户要求,要提取去年几个月的通话录音。由于是7* 24的业务,电话录音非常多,历史的录音记录每小时备份一次,用tar包的形式进行备份。录音记录存放的路径是:年/月/小时/录音文件
如:
2011/01/00/*.wav
2011/01/01/*.wav
…
2011/01/23/*.wav
这样每个月有28 到31 天,每天有24小时,每小时有n个录音文件。
假设每小时平均有800个电话。
1天的电话数量是:24 * 800 = 19200
1月的电话数量按平均30天计算: 24 *800 *30 =576000
1 季度的电话数量: 24×800×30×3 =1728000
每个录音文件又对应一个描述的xml文件,则一季度录音文件数量和xml文件数量共计
(24×800×30×3×2)=3456000
要从约340万个文件中提取指定的3万个通话的音频文件,该如何进行呢?
接到这个需求已经是快下班的时间了,要求在第二天必完成所有工作,提交客户。
思路如下:
先将所有的tar包中的文件解压出来,跟具提供的文件名去拷贝相关的问题件。
由于tar包非常多,先写了个脚本去批量解压所有tar包中的文件。解压后删除原有
的tar,释放空间。
脚本如下:
@echo off title unzip01 for /r . %%a in (*.tar) do ( cd "%%~pa" WinRAR e "%%a" del "%%a" ) |
如果安装了winrar,但提示找不到这个命令,可以把winrar的安装路径添加到环境变量path里。
为了提高速度,复制了几个脚本分别放在不同的目录下,同时进行解压。然后就下班了。
第二天文件都解压出来了,分别放在不同的目录下,且数量很大。怎么根据文件名查找相关的文件呢?如果能知道需要的文件的具体位置,直接用命令去复制就可以了。问题就转化为
如何获取需要文件的路径了。
1. 获取所有文件的路径
2. 把所有文件的路径存入到数据库的表中
3. 把需要的文件名存入表中
4. 根据文件路径表和文件名表进行关联查询,查找出需要提取的文件路径。
5. 写脚本拷贝指定路径名的文件。
实现方法:
1. Windows中用dir命令获取文件路径
dir /s/b > filepath.txt
2. 建表存放文件路径
a) CREATE TABLE tpath(fpath VARCHAR2(100) );
b) 用sql Loader把filepath.txt中的内容插入到tpath表中。
sqlldr user/password control=input02.ctl errors=10 rows=1000 bindsize=33554432 |
3. 建表存需要的文件名
a) CREATE TABLE tname (fname VARCHAR2(20) );
b) 把需要提取的文件名插入到tname表中。
4. 连表查询出需要提取的文件路径
SELECT 'copy ' || A.FPATH || ' d:\wav_bak', FPATH CMD FROM TPATH A, TNAME N WHERE SUBSTR(FPATH, 44, 15) = N.FNAME Substr中的参数要根据,文件存放路径与文件名的匹配情况进行调整。 |
5. 将第4步的查询结果,保存到bat文件中,进行文件拷贝。
注:第一步和第五步可以让多个命令或批处理同时运行,以提高效率。
其实后来想想,可以不解压文件。直接获取tar包中的文件名,得到文件在tar中的路
径,也可以。这样在提取文件的时候,要进行解压操作。没有对比过直接从指定的路径
拷贝文件快还是从tar中提取指定的文件快。这个有待验证。