在perl里使用KyotoCabinet

最近有个事情,统计站上所有视频文件的md5,导出的待分析的数据有28G,需要去重。我用perl的hash来处理,可以简单快速完成。但考虑到perl会使用较多内存,担心影响机器其他进程,根据一篇wiki,在perl中使用一个dbm来帮助管理内存,大概如下:

use KyotoCabinet;

my $db = tie(my %db, 'KyotoCabinet::DB');

# use the $db, such as:
# $db{$key} = $value;

undef($db);
untie(%db);

参考wiki的介绍内容如下2点:

  1. KyotoCabinet(简称kc)是一种轻量级的数据库,把它当做DBM,跟perl里面的tie结合,可以使用哈希结构来达到我们的计算目的。
  2. 不直接用perl的hash来做,是因为数据量比较大,怕内存溢出,实际上就是用kc来帮忙管理内存,我们可以很方便地使用哈希结构,在kc的内部kc自己会用内存做缓存的,冷的部分flush到磁盘。对比用perl hash的方案就是完全放内存的,直到物理内存溢出就用swap了,这样性能就比较低。

kc是一个key-value的数据库,这里应用到perl脚本里当成hash来保存我的处理数据,最后再把数据写到结果文件里。实际情况中,直接用perl的hash,使用内存达到5G,而用了kc,内存使用约为2.5G-2.8G左右(机器上有32G内存),结果文件为2.1G。当然,使用kc后perl的处理速度,相比直接使用perl的hash,相对要慢了。

在perl中使用kc,需要先安装kc,再安装kc的perl模块:

  1. kc的核心库: Source Packages of the core library (C/C++)
     ./configure --prefix=/opt/local
     make && make install
    
  2. kc的perl模块,不能指定安装目录: Source Packages for Perl
     perl Makefile.PL
     make && make install
    



如果真的在只有2G内存的机器上处理100G的数据,假如结果文件的大小超过内存,其效果又如何,实在好奇。因为我使用的机器内存有32G,待处理文件也只有28G,暂时无法验证kc是否能解决这个假定,后续有机会的话找个2G内存的普通笔记本再试试,目前虚拟机也没有linux(太不专业了)。

或者有兴趣的同学试试??

to be continue~~



– EOF –

Categories: perl