2014-07-11 15 views
5

Obserwuję niespójną szybkość danych. Tabelę funkcji fread. Mam 2 pliki o rozmiarze ~ 8 GB. Zawartość plików jest (prawie) taka sama. Czas na odczyt dwóch plików jest dziwnie inny.R fread data.table niespójna prędkość

control.major <- fread("control.major.gff")$V6 
Read 19.8% of 98100000 rows 
Read 98100000 rows and 10 (of 10) columns from 7.947 GB file in 02:06:58 
control.minor <- fread("control.minor.gff")$V6 
Read 98100000 rows and 10 (of 10) columns from 7.947 GB file in 00:03:15 

Muszę przeczytać 6. kolumnę plików, które są wszystkie numeryczne. Początkowo okazało się, że fread był szybszy w porównaniu do

scan(pipe("cut -f6 SNP.major.gff"), sep="\n") 

Ponieważ funkcja cięcia zajmowała strasznie dużo czasu.

Dlaczego występuje niespójne zachowanie się fred? Czy istnieje szybszy sposób odczytu jednej kolumny?

+1

Zgaduję, że drugie polecenie jest wolne z powodu 'skanowania', a nie z powodu' cut', więc spróbowałem 'fread ('cut -f6 SNP.major.gff')' zamiast tego – eddi

+0

przy okazji czas brzmi szalenie długo - 2 godziny ?! - Być może uda ci się bardziej wyizolować problem i spróbować zobaczyć, czy dostajesz długi czas z niewielką częścią tego pliku. – eddi

+0

@eddi Nie sądzę, aby różnica między skanowaniem a robieniem była większa niż czas wykonania cięcia. Jego cięcie jest znacznie wolniejsze. – vinash85

Odpowiedz

3

Miałem podobny problem. Mianowicie, po raz pierwszy, gdy biegałem w biegu, było bardzo wolno, jednak kolejne przebiegi były znacznie szybsze. W moim przypadku wynikało to z faktu, że pracowałem na komputerze w pracowni komputerowej mojego Uniwersytetu. W związku z tym dane nie były lokalnie na moim komputerze, ale były w sieci. Oznaczało to, że większość czasu spędzonego na uruchamianiu freada była reprezentowana przez przeniesienie danych przez sieć do mojej lokalnej pamięci roboczej. Zostało to potwierdzone przez fakt, że kiedy wyliczyłem czas mojego kodu przy pierwszym uruchomieniu, user time + sys. time < < elapsed time.

Podczas jednorazowego ładowania danych tymczasowo znajduje się ona w pamięci roboczej, tzn. W pamięci RAM. Kolejne wywołania do przeglądania za pomocą tych samych danych są zatem znacznie szybsze.

Wiem, że to stary wątek, ale to był jeden, przez który mogłem się zmierzyć, gdy próbowałem rozwiązać mój problem z fredą. Mam więc nadzieję, że pomoże to innym osobom z podobnym problemem w przyszłości!

3

Dlaczego załadowanie trwało 2 godziny?

Uruchom go ponownie pod numerem verbose=TRUE i dołącz pełne dane wyjściowe do pytania. Może system operacyjny umieścił go w tle, gdy coś innego działało, czy coś w tym stylu. Czy twój laptop zawiesił się lub hibernował w tym czasie? Proszę również podać dane wyjściowe: sessionInfo().

Czy istnieje szybszy sposób odczytu jednej kolumny?

Tak. Możesz przekazać wektor nazw kolumn lub pozycji do argumentu select. Zobacz ?fread. Ale podejrzewam, że te dwa problemy nie są ze sobą powiązane.