楼主:
unknown (ya)
2024-07-12 20:22:36饿死抬头
我在工作上撰写一些程式给同仁使用
主要是以perl做文件内容的更改或比较
一开始都还没问题,但随着档案愈来愈大,效能就是一个问题了
档案目前大约3G-9G不等,我写法是从IO做读写
同仁会输入一串字串,然后要与文件内容作比较
输入:
$input = "AX.BC.\\SR\\d";
$source = "Banana";
$tar = "APPLE";
这似这样
我的程式码大约这样写
$line=1;
open fid_wr,">file2";
open fid_rd,"<file1";
while(<fid_rd>){
$tmp = $_;
if($tmp =~ /$input/){
printf("Matched in line %d\n",$line);
$tmp =~ s/$source/$tar;
}
printf(fid_wr "$tmp");
$line++;
}
close fid_rd;
close fid_wr;
目前搜寻一个大约3G大小的文件就要耗费2分钟
如果同仁搜寻更多,那就要更久了
因此在想有没有方法可以让其更快的做完?
目前我想到先把所有的资料load到memory,然后走memory来做比较
可以节省IO的时间,不过memory只有1.5T,担心多人使用就卡死了
有试过先push到array,再一起写入硬盘,但更慢
所以还是边读边写才是最快的
我们是使用CentOS 7,硬盘是一般传统硬盘
因为是公司资源,所以硬盘没得动,系统没得动,一切就是手边现有资源
希望有知道怎么解决的人可以帮忙一下,或是提供我关键字搜寻也好
我可以自己找资料没问题的,因为我在网络上有先找过
但如果同时要用正规表示式来支援万用字符,又要兼顾修改
作者:
flu (Crazy Rhythm)
2024-07-13 20:25:00如果要纯用perl 读整个档作处理的话 可能用File::Map 对内存的管理会比较有效一点 后续再看要multi-thread, -procces用外部工具的话 看人弄过印象中是 parallel(1) 搭 grep(1)现有工具中 ag, ripgrep 处理大档也蛮快的