Tôi có một ứng dụng đọc dữ liệu văn bản khổng lồ thành một kích thước vô hướng, đôi khi thậm chí là GB. Tôi sử dụng substr
trên vô hướng đó để đọc hầu hết dữ liệu vào vô hướng khác và thay thế dữ liệu được trích xuất bằng một chuỗi rỗng, bởi vì nó không cần thiết trong vô hướng đầu tiên nữa. Những gì tôi đã tìm thấy gần đây là Perl không giải phóng bộ nhớ của vô hướng đầu tiên, trong khi nó nhận ra rằng chiều dài hợp lý của nó đã thay đổi. Vì vậy, những gì tôi cần làm là trích xuất dữ liệu từ vô hướng đầu tiên thành thứ ba một lần nữa, undef
vô hướng đầu tiên und đặt dữ liệu được trích xuất trở lại tại chỗ. Chỉ có cách này bộ nhớ bị chiếm bởi vô hướng đầu tiên thực sự được giải phóng. Gán undef cho vô hướng đó hoặc một số giá trị khác nhỏ hơn khối được cấp phát bộ nhớ không thay đổi bất cứ điều gì về bộ nhớ được cấp phát.Perl: Khi nào bộ nhớ không cần thiết của một vô hướng giải phóng mà không đi ra khỏi phạm vi?
Sau đây là những gì tôi làm bây giờ:
$$extFileBufferRef = substr($$contentRef, $offset, $length, '');
$length = length($$contentRef);
my $content = substr($$contentRef, 0, $length);
$$contentRef = undef($$contentRef) || $content;
$$contentRef
có thể là ví dụ Kích cỡ 5 GB trong dòng đầu tiên, tôi trích xuất 4,9 GB dữ liệu và thay thế dữ liệu được trích xuất. Dòng thứ hai giờ đây sẽ báo cáo ví dụ: 100 MB dữ liệu dưới dạng chiều dài của chuỗi, nhưng ví dụ: Devel::Size::total_size
vẫn sẽ xuất 5 GB dữ liệu được phân bổ cho vô hướng đó. Và chỉ định undef
hoặc chẳng hạn như $$contentRef
dường như không thay đổi một điều gì về điều đó, tôi cần gọi undef
làm chức năng trên vô hướng đó.
Tôi đã dự kiến rằng bộ nhớ đằng sau $$contentRef
đã được giải phóng ít nhất một phần sau khi substr
được áp dụng. Dường như không phải là trường hợp ...
Vì vậy, bộ nhớ chỉ được giải phóng nếu các biến nằm ngoài phạm vi? Và nếu có, tại sao chỉ định undef
khác nhau để gọi undef
làm hàm trên cùng một vô hướng?
Bạn có cần ** bộ nhớ đó ở nơi khác không? – simbabque
Có, tôi có nhiều bản sao của dữ liệu xung quanh vì các lý do khác nhau và bổ sung toàn bộ quá trình có thể được thực hiện song song. Vì vậy, một số GB bộ nhớ bị lãng phí trong toàn bộ quá trình là điều tôi cần quan tâm. Và có, có thể là thiết kế xấu và tất cả, nhưng đó là cách nó hiện đang ... –