Mam aplikację, która odczytuje gigantyczną porcję danych tekstowych w skalar, czasami nawet w GB. Używam substr
na tym skalarku, aby odczytać większość danych w innym skalarze i zastąpić wyodrębnione dane pustym łańcuchem, ponieważ nie jest już potrzebny w pierwszym skalarze. Ostatnio odkryłem, że Perl nie zwalnia pamięci pierwszego skalara, ale rozpoznaje, że jego logiczna długość uległa zmianie. Muszę więc najpierw wyodrębnić dane z pierwszego skalaru do trzeciego, najpierw skalarować i przywrócić wyodrębnione dane z powrotem. Tylko w ten sposób pamięć zajmowana przez pierwszy skalar jest naprawdę uwolniona. Przypisanie undef do tego skalaru lub jakiejś innej wartości mniejszej niż przydzielony blok pamięci nie zmienia niczego w przydzielonej pamięci.Perl: Kiedy jest niepotrzebna pamięć skalarna uwolniona bez wychodzenia poza zakres?
Oto, co robię teraz:
$$extFileBufferRef = substr($$contentRef, $offset, $length, '');
$length = length($$contentRef);
my $content = substr($$contentRef, 0, $length);
$$contentRef = undef($$contentRef) || $content;
$$contentRef
może być na przykład 5 GB w pierwszym wierszu, wydobywam 4,9 GB danych i zastępuję wyodrębnione dane. Drugi wiersz będzie teraz raportować np. 100 MB danych jako długość ciągu, ale np. Devel::Size::total_size
nadal będzie wyświetlać dane o 5 GB danych dla tego skalaru. I przypisanie undef
lub podobnym do $$contentRef
nie wydaje się, że coś w tym zmieni, muszę wywołać undef
jako funkcję tego skalara.
Spodziewałbym się, że pamięć za $$contentRef
została już przynajmniej częściowo zwolniona po zastosowaniu substr
. Wygląda na to, że ...
Czy pamięć jest zwalniana tylko wtedy, gdy zmienne wykraczają poza zakres? A jeśli tak, dlaczego przypisanie undef
różni się od wywoływania undef
jako funkcji na tym samym skalarnym?
Czy ** potrzebujesz ** tej pamięci w innym miejscu? – simbabque
Tak, mam wiele kopii danych z różnych powodów, a ponadto cały proces może być wykonywany równolegle. Więc niektóre zmarnowane GB pamięci podczas całego procesu są czymś, o co muszę dbać. I owszem, może to być zły projekt i wszystko, ale tak właśnie jest obecnie ... –