Perl에서 해시가 차지하는 물리적 메모리의 양을 찾는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/106555

  •  01-07-2019
  •  | 
  •  

문제

해시 테이블을 사용하여 매우 간단한 캐시를 유지 관리하는 Perl 스크립트가 있습니다.Perl(32비트)의 메모리 부족 및 충돌을 방지하기 위해 해시가 n 바이트 이상을 차지하면 해시를 지우고 싶습니다.

키-값 쌍의 수를 확인할 수 있습니다.

if (scalar keys %cache > $maxSize)
 {
 %cache = ();
 }

그런데 해시가 차지하는 실제 메모리를 확인할 수 있나요?

도움이 되었습니까?

해결책

개발::크기 귀하의 질문에 대한 답변입니다.(Devel::Size는 대규모 데이터 구조를 처리할 때 일시적으로 상당한 양의 메모리를 할당하므로 이 목적에는 실제로 적합하지 않습니다.)

하지만, 캐시::SizeAwareMemoryCache 그리고 타이::캐시 당신이 찾고 있는 것을 이미 구현하고 있으며(다소 다른 인터페이스로), 바퀴를 재발명하는 수고를 덜 수 있습니다.

메모하기 함수의 반환 값을 간단하게 캐시할 수 있게 해주는 모듈입니다.크기 기반 캐시 제한을 구현하지 않지만 Tie::Cache를 Memoize의 백엔드로 사용할 수 있습니다.

다른 팁

당신이 찾고있는 개발::크기

이름

Devel::Size - Perl 변수의 메모리 사용량을 찾기 위한 Perl 확장

개요

use Devel::Size qw(size total_size);

my $size = size("A string");
my @foo = (1, 2, 3, 4, 5);
my $other_size = size(\@foo);
my $foo = {a => [1, 2, 3],
        b => {a => [1, 3, 4]}
       };
my $total_size = total_size($foo);

설치할 수 있습니다 개발::크기 Perl의 모든 구성이 차지하는 메모리를 알아내는 것입니다.그러나 많은 양의 중간 메모리가 필요하므로 큰 데이터 구조에는 사용하지 않을 것입니다.메모리가 부족할 수 있다고 생각되면 절대 그렇게 하지 않을 것입니다.

그런데 CPAN에는 메모리 캐싱 등을 수행할 수 있는 좋은 모듈이 많이 있습니다.직접 굴리기보다는 그 중 하나를 대신 사용하는 것이 좋습니다.예를 들어 타이::캐시::LRU 지정된 수의 키까지만 작동하는 메모리 내 캐시의 경우.

당신이 사용할 수있는 개발::크기 사용되는 메모리를 결정하지만 일반적으로 OS에 반환 메모리를 제공할 수는 없습니다.하지만 그냥 지우고 재사용하려고 하는 것 같으니 잘 작동할 것입니다.

캐시가 함수용인 경우 다음을 사용하는 것을 고려하세요. 메모하기 캐시를 직접 유지 관리하는 대신 모듈을 사용하세요.캐시 만료(Memoize::Expire를 통해)를 지원하므로 캐시를 완전히 파괴하지 않고도 캐시 크기를 제한할 수 있습니다.

Perl이 사용하는 메모리 양을 관리하는 것이 걱정된다면 아마도 다른 접근 방식을 살펴봐야 할 것입니다.왜 한 번에 그렇게 많은 양의 RAM이 필요한가요?일종의 지속성 시스템을 사용해야 합니까?

캐시::메모리

use Cache::Memory;

my $cache = Cache::Memory->new(
  namespace => 'MyNamespace',
  default_expires => '600 sec'
);

my $size  = $cache->size()
my $limit = $cache->size_limit();

다른 사람들이 말했듯이 캐싱은 다시 개발해야 하는 바퀴가 아닙니다. CPAN에는 작업을 훌륭하게 수행할 수 있는 간단한 캐싱 솔루션이 많이 있습니다.

캐시::SizeAwareMemoryCache 사용하려는 최대 크기를 알려준 다음 캐시를 관리하도록 맡길 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top