Skip to: Site menu | Main content

Autor

Chłopak z Bałut (Dołów), po uniwerku i stypendium. Wiecznie zestresowane, przemądrzałe bezguście. Więcej na stronie domowej.

Libtrash a SQLite

Klepanie, Techblog

Ostatnio, przy okazji analizowania danych z GoldenLine, miałem olbrzymi problem z wydajnością bazy danych SQLite. Obszedłem go w ten sposób, że zrestartowałem skrypt i zacząłem zapisywać dane do nowej bazy, ale męczyło mnie to nadal i dzisiaj postanowiłem zdiagnozować sytuację. Okazało się, że wina leży po stronie biblioteki Libtrash.

Libtrash to uniwersalny kosz dla systemów GNU. Wystarczy przy uruchomieniu wyeksportować zmienną LD_PRELOAD, do której przypisze się ścieżkę do biblioteki i wszystkie wywołania unlink zostaną przechwycone, a plik przeniesiony do kosza (bibliotekę można tak skonfigurować, żeby mimo wszystko usuwała określone rodzaje plików). Mechanizm jest o tyle ciekawy, że działa zawsze - bez względu na program, którego używamy.

No i tu pojawił się problem. SQLite, przy każdym wywołaniu, otwierał nową transakcję i tworzył plik dziennika, który następnie usuwał. Libtrash postępuje w ten sposób, że w przypadku usunięcia pliku, który już istnieje w koszu, nadaje kopiom kolejne numery. Niestety, korzystał przy tym z liniowego algorytmu, który, po usunięciu ok. 50000 dzienników, zaczął strasznie spowalniać skrypt. Oczywiście, pliki dziennika można wyłączyć spod ochrony libtrasha. Mimo wszystko, postanowiłem usprawnić bibliotekę, zamieniając liniowy algorytm na logarytmiczny. Z mojej strony można pobrać patch do wersji 2.6, który za jakiś czas być może pojawi się również w kolejnej wersji tej biblioteki.

01 maja 2007, 17:34:16

Komentarze

Treść komentarza można formatować zgodnie ze składnią Textile.
Odpowiedzi śledzić można przy pomocy RSS RSS .