wtorek, 22 czerwca 2010

Dzisiejsza wpadka

Tym akurat nie powinienem się chwalić na blogu, ale co mi tam.......
Dzisiaj miałem za zadanie sprawdzić, które stacje permanentne wykonują/wykonywały kiedykolwiek obserwacje do satelitów Glonass. Wklepałem więc prostą funkcję, która przegląda wszystkie pliki .log (ze szczegółowym opisem stacji) oraz zapisuje do pliku nr stacji, jak i typ używanego odbiornika (czy GPS czy GPS/GLONASS). A że funkcja trochę długo działała, to bezstrosko poszedłem sobie na obiad. Po powrocie z posiłku zauważyłem, że ludzie dziwnie wpadli w zaniepokojenie graniczące już z paniką...... mianowicie dysk sieciowy z danymi zaczął się przepełniać..... Oczywiście już było wiadome, kto jest winny..... zanim zdążyłem usiąść wygodnie na swoim krześle, usłyszałem pytanie: "Krzysiu, co teraz robisz?" Okazało się, że plik, który stworzyłem (a w zasadzie nadal się tworzył) zajmował już około 500000000000 bajtów, czyli 500 GB i właśnie zaczęło brakować miejsca......
Dlaczego tak się stało? Otóż program przeglądał wszystkie pliki z folderu i zapisywał typ odbiornika do nowego pliku. Ale kiedy program przejrzał wszystkie pliki zobaczył, że jest tam jeszcze ten plik, do którego właśnie zapisał nowe dane i w dodatku ten sam plik zawiera także informacje o odbiornikach. Więc plik zaczął czytać sam siebie i do samego siebie zapisywać informacje, które właśnie przeczytał. A z tego powodu, że coraz więcej zapisywał informacji do samego siebie, więcej też musiał odczytać, więc znowu więcej musiał zapisać. Czyli rekursja w czystej postaci.
Teraz już wiem, że nie należy łączyć ze sobą w UNIXie funkcji 'grep' z gwiazdką '*' i zapisem do pliku '>' :P
Oczywiście skasowałem ten plik i stworzyłem nowy, poprawny, który zajmuje obecnie.... 500 kB, czyli milion razy mniej niż poprzednio....
Cała historia tak się spodobała w instytucie, że Simon wydrukował status zajętości dysku z dzisiejszego dnia i wywiesił to na tablicy z dowcipami.....

1 komentarz: