2008-09-24 10 views
8

Czy mieszanie zmniejsza się w Perlu podczas usuwania elementów.Czy mieszanie zmniejsza się w Perlu podczas usuwania elementów?

Dokładniej miałem perl program, który odziedziczyłem, że zanalizować ogromny plik (1 GB) i załadować hash mieszań. Zrobiłby to samo dla innego pliku, a następnie dokonałby porównania różnych elementów. Zużycie pamięci było ogromne w trakcie tego procesu i pomimo tego, że dodałem usuwanie elementów haszujących, użyto ich, aby zużycie pamięci wydawało się nienaruszone.

Scenariusz był bardzo powolny i taki świst pamięci. Wiem, że to nie było dobrze zaprojektowane, ale jakieś pomysły na temat użycia pamięci hash?

Odpowiedz

7

Ogólnie Perl nie może zwrócić pamięci do systemu operacyjnego. Może jednak wewnętrznie wykorzystywać pamięć, co może zmniejszyć ilość pamięci potrzebnej dla programu.

See perlfaq3: How can I free an array or hash so my program shrinks?

Jeśli pamięć używana przez mieszań jest nadmierna (tj> Pamięć fizyczna) można tie je do pliku na dysku. To znacznie zmniejszyłoby zużycie pamięci, ale należy pamiętać, że dostęp do struktury na dysku jest znacznie wolniejszy niż dostęp do pamięci. (Tak samo jest z dyskiem.)

11

Możesz chcieć sprawdzić coś w stylu: DBM::Deep. Robi to wiążąc rzeczy, o których wspomniał Michael, więc nie musisz o tym myśleć. Wszystko jest przechowywane na dysku zamiast w pamięci. Po prostu nie ma potrzeby posiadania lepszego serwera baz danych.

Ponadto, jeśli chcesz wyśledzić wąskie gardło wydajności, sprawdź Devel::NYTProf, nową gorliwość w profilowaniu Perla, która wyszła z Nowego Jorku Times.

5

Jeśli hash jest naprawdę gigantyczny, lepszą strategią jest prawdopodobnie użyć skrótu na dysku i niech OS martwić się o rzeczy do iz pamięci. Szczególnie lubię Berkeley DB do przechowywania dużych haszów na dysku, a moduł Perl BerkeleyDB zapewnia w pełni funkcjonalny interfejs, w tym związany interfejs API.

DBM::Deep może być również stosowany jako zamiennik hash, ale opiera się na własnym formacie. Może to być uciążliwe, jeśli twoja struktura musi zostać odczytana przez inne systemy (poza Perlem).

4

Jeśli dane wejściowe w drugim pliku są potrzebne tylko raz (ponieważ są odczytywane), możliwe jest zmniejszenie zużycia pamięci o połowę.

W zależności od algorytmu możliwe jest nawet przytrzymanie otwartych uchwytów plików i małych wartości nieużytych jeszcze w pamięci. Przykładem może być scalenie lub porównanie posortowanych danych - wystarczy trzymać aktualną linię z każdego pliku i porównywać je ze sobą, przeskakując do przodu, aż zmieni się cmp.

Innym podejściem może być wykonywanie wielu przejść, szczególnie jeśli w komputerze znajduje się co najmniej jeden bezczynny rdzeń. Otwieranie odczytanych potoków i podprocesów dostarcza dane w poręcznych, wstępnie zorganizowanych porcjach.

Aby uzyskać bardziej ogólne algorytmy, można uniknąć płacenia za rozmiar pamięci, handlując nią kosztem prędkości dysku.

W większości przypadków, załadunek każde źródło danych do pamięci wygrywa tylko na czas rozwoju - wtedy płacisz za nim w ślad i/lub prędkości, gdy N dostaje duże.

5

Jeśli chodzi o konkretne pytanie: Nie, usunięcie hashów nie zmniejsza zużycia pamięci twojego programu.

Odnośnie bardziej ogólnego przypadku: znaczna większość programów i języków nadal będzie używać pamięci, z której wcześniej korzystały, ale obecnie jej nie używa. Dzieje się tak dlatego, że żądanie alokacji pamięci przez system operacyjny jest stosunkowo powolną operacją, więc zachowują ją na wypadek, gdyby była potrzebna później.

Tak więc, jeśli chcesz poprawić tę sytuację, musisz zmniejszyć maksymalną ilość pamięci wymaganą przez program, zmieniając algorytmy, aby nie wymagać dostępu do tak dużej ilości danych jednocześnie, używając -disk (takie jak wyżej wspomniany DBM :: Deep) lub zwalniając spację z niepotrzebnych zmiennych z powrotem do perla (pozwól im wyjść poza zakres lub ustaw je na undef), aby można było ponownie użyć.

4

Obejście: rozwidlenie procesu potomnego, który przydziela całą pamięć. Niech zwróci niektóre zagregowane informacje, kiedy zrobi to; kiedy rozwidlony proces umiera, jego pamięć będzie z nim działać. Trochę bólu, ale działa w niektórych przypadkach. Przykład przypadku, w którym to pomaga, jeśli przetwarzasz wiele plików, każdy plik po jednym, tylko kilka plików jest dużych, a mały stan pośredni musi być zachowany.

Powiązane problemy