[问题] 如何改善大文件的读写效能

楼主: 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 处理大档也蛮快的
作者: jkchang (JK)   2024-07-14 08:57:00
将printf("Matched.. 先关掉结果输出档案拿掉,然后用>>将结果重新导向到档案如果可以的话用sedsed -n '/AX.BC.\sR[0-9]/ s/Banana/APPLE/g p' file2sed -n '/AX.BC.\sR[0-9]/ s/Banana/APPLE/g p' file1接上 >> file2
作者: herculus6502 (金麟岂是池中物)   2024-08-15 08:17:00
regular expression纯拿来搜寻真的是overkill

Links booklink

Contact Us: admin [ a t ] ucptt.com