2012-09-27 40 views
5

Tôi phải đối mặt với một vấn đề lạ về xử lý bộ nhớ trong perl. Tôi đang làm việc trong một ứng dụng perl sử dụng cấu trúc băm khá lớn. Tôi đang gán các đối tượng ref và fro. Nhưng cuối cùng có vẻ như ngay cả khi tôi đang deallocating đối tượng và băm, việc sử dụng bộ nhớ là như nhau.Quản lý bộ nhớ trong perl

Đây là một ví dụ về các vấn đề:

my $hash = {}; 
............. 
this ds gets populated with a lot of data ... 
....... 
{ 
     my $obj = new Class("data"=>$hash); 
....... 
....... 
...... 

} 

#even undefing the $hash 
undef $hash; 

# I can expect some improvement in Memory Utilization, but its not happening 

Tôi nghĩ rằng tôi đang làm một số sai lầm rất cơ bản. Bất kỳ ai có thể đề nghị?

Trả lời

3

Nói chung, quản lý bộ nhớ Perl làm những gì bạn cần làm, và bạn không cần phải lo lắng về nó. Ví dụ, tác hại của việc giữ một phần lớn bộ nhớ được phân bổ cho phần còn lại của chương trình của bạn là gì? Có lẽ không. Perl sẽ phát hành nếu hệ điều hành của bạn có nguy cơ hết bộ nhớ.

Giả sử bạn có một số trường hợp đặc biệt, như tập lệnh chạy liên tục trong nền, nhưng đôi khi cần thực hiện tác vụ tốn nhiều bộ nhớ. Bạn có thể giải quyết điều này bằng cách tách nó thành hai tập lệnh: background.pl và memory-intensive-task.pl. Background.pl sẽ thực thi memory-intensive-task.pl khi cần thiết. Bộ nhớ sẽ được giải phóng khi chương trình này hoàn thành và thoát.

12

Bạn không thể thực sự trả lại bộ nhớ cho hệ điều hành. Perl thường sẽ giữ nó để tái phân bổ nó sau này, mặc dù nó sẽ thu thập rác thường xuyên.

Xem http://learn.perl.org/faq/perlfaq3.html#How-can-I-free-an-array-or-hash-so-my-program-shrinks-

http://clokwork.net/2012/02/12/memory-management-in-perl/

+0

Điều gì xảy ra trong trường hợp đối tượng? Khi một đối tượng nằm ngoài phạm vi, hàm hủy được gọi. Điều này sẽ vẫn giữ bộ nhớ của các biến từ vựng được xác định trong đối tượng? – Kallol

+0

@Kallol, trường hợp đó không khác với biến bình thường nằm ngoài phạm vi, ngoại trừ việc bạn có thể thực hiện một số tùy chỉnh dọn dẹp đối tượng của mình. Bộ nhớ * sẽ * miễn phí cho Perl để sử dụng cho một thứ khác, nhưng Perl vẫn không đưa nó trở lại hệ thống. – dan1111

+0

loại dọn dẹp theo yêu cầu nào có thể được thực hiện? – Kallol

Các vấn đề liên quan