Próbuję wyśledzić problem z pamięcią przez kilka dni - mój program zużywa około 3 GB pamięci, kiedy powinno używać około 200MB-300MB. Valgrind faktycznie informuje, że używa w szczytowym momencie ~ 300 MB i nie zgłasza żadnych wycieków pamięci.Nie można wyśledzić źródła ogromnego użycia pamięci
Program odczytuje plik wejściowy i przechowuje wszystkie unikalne słowa w tym pliku. Jest wielowątkowy i uruchomiłem go za pomocą 4 wątków. Moje główne źródła danych są:
- stałym rozmiarze tablicy wchar_t (4MB łącznie)
- Mapa między słowami i listy wartości stowarzyszonych. To rośnie wraz z rozmiarem danych wejściowych. Jeśli w pliku wejściowym znajduje się 1 000 000 unikalnych słów, w drzewie będzie 1 000 000 wpisów.
Wykonuję ogromną liczbę alokacji i deallokacji (przy użyciu nowych i usuń) - co najmniej dwa na jedno unikalne słowo. Czy to możliwe, że pamięć, którą uwolniłem, nie jest ponownie wykorzystywana z jakiegoś powodu, powodując, że program wciąż zdobywa coraz więcej pamięci? Konsekwentnie pobiera więcej, ponieważ nadal działa.
Generalnie, wszelkie pomysły dotyczące tego, dokąd powinieneś się udać?
Edytuj 1 (na podstawie porady od Grahama): Jedna ścieżka, którą spróbuję, to minimalizacja alokacji. Będę pracował z pojedynczym ciągiem na wątek (który może rosnąć sporadycznie, jeśli słowo jest dłuższe niż ten ciąg), ale jeśli dobrze zapamiętam mój kod, wyeliminuje to ogromną liczbę nowych/usuniętych połączeń. Jeśli wszystko pójdzie dobrze, pozostanę z: jednorazową alokacją bufora wejściowego, jednorazową alokacją ciągu znaków na wątek (z pewnymi reallocs), dwoma allocs na wpis na mapę (jeden dla klucza, drugi dla wartości).
Dzięki!
odpowiedź Grahama wydaje się ważne. W jaki sposób określasz, ile pamięci jest używane i jaki system operacyjny (i czy jest to 64-bitowy lub 32-bitowy)? Czy obiekty, które dopiero tworzysz/usuwasz, to struktury danych lub pełnoprawne obiekty klasowe? – Foon
Używam Valgrind i polecenie free -m (informuje, ile pamięci jest wolnej, daje mi przybliżony pomysł, gdy zużywa mnóstwo pamięci). To jest na 64-bitowym systemie Linux. Próbowałem tego używając std :: string i stringów w stylu c. – lapis