-301,6 +301,107 |
* '''메모리 사용량이 실험2와 동일하게 늘었다'''. |
=== # 실험4 - 매번 객체 만들기 === |
생각해보니까, 정작 이 테스트를 빼먹었다. 루프를 2만 번 돌면서 매번 Archive::Zip 객체를 새로 생성해서 사용하자. |
{{{#!vim perl |
for my $num ( 1 .. 20000 ) { |
# Archive::Zip 오브젝트를 매번 생성 |
my $zip = Archive::Zip->new(); |
# 압축 파일을 매번 읽고 |
$zip->read($file); |
# 특정 파일을 추출 |
$zip->extractMemberWithoutPaths($member); |
} |
}}} |
<memo(전체 코드 - 길어서 감춤)> |
{{{#!vim perl |
#!/usr/bin/env perl |
use strict; |
use warnings; |
# local $| = 1; |
use Archive::Zip qw/:ERROR_CODES :CONSTANTS/; |
use Time::HiRes qw/gettimeofday tv_interval/; |
use Memory::Usage; |
my $member = 'LIST.txt'; # ZIP 파일 내에서 꺼낼 파일 |
my $file = '/home/gypark/temp/gearman/data/00001.zip'; |
my $mu = Memory::Usage->new; |
my $time_read = 0; |
my $time_extract = 0; |
my $t0; |
my $elapsed; |
$mu->record('before loop'); |
for my $num ( 1 .. 20000 ) { |
# Archive::Zip 오브젝트를 매번 생성 |
my $zip = Archive::Zip->new(); |
# 압축 파일을 매번 읽고 |
$t0 = [ gettimeofday ]; |
$zip->read($file); |
$elapsed = tv_interval($t0); |
$time_read += $elapsed; |
# 특정 파일을 추출 |
$t0 = [ gettimeofday ]; |
$zip->extractMemberWithoutPaths($member); |
$elapsed = tv_interval($t0); |
$time_extract += $elapsed; |
if ( $num % 1000 == 0 ) { |
printf("%d, %.6f, %.6f\n", $num, $time_read/1000, $time_extract/1000); |
$time_read = 0; |
$time_extract = 0; |
} |
# 추출했던 파일은 삭제 |
unlink $member or die "unlink:$!"; |
} |
$mu->record('after loop'); |
$mu->dump(); |
}}} |
</memo> |
결과: |
{{{ |
1000, 0.000419, 0.000705 |
2000, 0.000361, 0.000610 |
3000, 0.000412, 0.000692 |
4000, 0.000428, 0.000721 |
5000, 0.000457, 0.000770 |
6000, 0.000459, 0.000787 |
7000, 0.000475, 0.000797 |
8000, 0.000421, 0.000705 |
9000, 0.000428, 0.000721 |
10000, 0.000424, 0.000715 |
11000, 0.000418, 0.000706 |
12000, 0.000439, 0.000735 |
13000, 0.000388, 0.000636 |
14000, 0.000478, 0.000790 |
15000, 0.000456, 0.000777 |
16000, 0.000433, 0.000727 |
17000, 0.000425, 0.000721 |
18000, 0.000322, 0.000543 |
19000, 0.000392, 0.000655 |
20000, 0.000395, 0.000665 |
time vsz ( diff) rss ( diff) shared ( diff) code ( diff) data ( diff) |
0 94872 ( 94872) 8884 ( 8884) 2036 ( 2036) 1412 ( 1412) 7140 ( 7140) before loop |
24 94872 ( 0) 8976 ( 92) 2096 ( 60) 1412 ( 0) 7140 ( 0) after loop |
}}} |
* read() 시간도 일정 |
* extract() 시간도 일정 |
* 메모리도 별다른 누수는 없는 걸로 보임 |
* 매번 객체를 생성하는 오버헤드는 어쩔 수 없이 있겠지만, 전체 실행 시간을 생각하면 훨씬 이득이다. (24초 정도 걸렸음) |
=== # 중간 결론 === |
* read()가 압축 파일을 읽을 때 기존에 읽었던 메모리를 제대로 반납하지 않는지, read()를 할 때마다 메모리를 차지함 |