2011-08-08 13 views
6

Mam kilka dużych, dużych plików, z którymi pracuję i używam kilku różnych funkcji wejścia/wyjścia, aby uzyskać do nich dostęp. Najpopularniejszym jest pakiet bigmemory.Sprawdzanie, czy bufory zostały przepłukane w R

Podczas zapisywania plików, nauczyłem się trudnego sposobu na opróżnianie buforów wyjściowych, w przeciwnym razie wszystkie zakłady są wyłączane, czy dane zostały zapisane. Jednak może to prowadzić do bardzo długich czasów oczekiwania, podczas gdy bigmemory robi to samo (wiele minut). Nie wiem, dlaczego tak się dzieje - nie zawsze się to zdarza i nie jest łatwo reprodukowane.

Czy istnieje sposób określenia, czy bufory I/O zostały opróżnione w R, szczególnie dla bigmemory? Jeśli system operacyjny ma znaczenie, możesz w ten sposób ograniczyć odpowiedź.

Jeśli odpowiedź może być uogólniona poza bigmemory, byłoby świetnie, ponieważ czasami polegam na innych funkcjach mapowania pamięci lub strumieniach We/Wy.

Jeśli nie ma dobrych rozwiązań sprawdzających, czy bufory zostały przepłukane, czy istnieją przypadki, w których można założyć, że bufory zostały przepłukane? To znaczy. oprócz używania flush().

Aktualizacja: Powinienem wyjaśnić, że są to połączenia binarne. @RichieCotton zauważył, że isIncomplete(), chociaż dokumentacja pomocy wspomina jedynie połączenia tekstowe. Nie jest jasne, czy jest to użyteczne dla połączeń binarnych.

+0

Not sure about use with 'bigmemory', ale' isIncomplete' działa dla zwykłych połączeń. –

+0

Dzięki! Bardzo ograniczone informacje na temat pomocy połączeń wspomina jedynie, że isIncomplete nadaje się do produkcji połączeń tekstowych. Miałeś szczęście z połączeń binarnych? – Iterator

Odpowiedz

0

będę przedstawiła własną odpowiedź, ale mile widziane niczego, co jest jaśniejsze.

Z tego, co dotychczas widziałem, różne funkcje połączeń, np. file, open, close, flush, isOpen i isIncomplete (między innymi) są oparte na określonych typach połączeń, np. pliki, potoki, adresy URL i kilka innych rzeczy.

W przeciwieństwie do tego, bigmemory ma swój własny typ połączenia, a obiekt bigmemory to obiekt S4 z gniazdem na adres pamięci dla buforów systemu operacyjnego. Po umieszczeniu tam system operacyjny odpowiada za opróżnianie tych buforów. Ponieważ jest to odpowiedzialność systemu operacyjnego, uzyskanie informacji o "brudnych" buforach wymaga interakcji z systemem operacyjnym, a nie z R.

Tak więc odpowiedź dla bigmemory jest "nie", ponieważ dane są przechowywane w buforze jądra, chociaż może być "tak" dla innych połączeń obsługiwanych przez STDIO (tj. przechowywanych w "przestrzeni użytkownika").

Po więcej informacji na stronie OS/jądra rzeczy, zobaczyć this question on SO; Ja bada kilka programów (nie tylko R + bigmemory), które są produkujący buforowe spłukiwania ciekawostki, i że gwint pomógł mnie oświecić o boku jądra rzeczy.

0

Czy to jest bardziej przekonujące, że isIncomplete() działa z plikami binarnymi?

# R process 1 
zz <- file("~/test", "wb") 
writeBin(c(1:100000),con=zz) 
close(zz) 

# R process 2 
zz2 <- file("~/test", "rb") 
inpp <- readBin(con=zz2, integer(), 10000) 
while(isIncomplete(con2)) {Sys.sleep(1); inpp <- c(inpp, readBin(zz2),integer(), 10000)} 
close(zz2) 

(Modified z pomocą() pliku połączenia.)

+0

Dzięki za testowanie tego. Jednak chyba jestem błędnej interpretacji, że Twój przykład używa go tylko w przypadku buforów wejściowych.Nie jestem do końca pewien, czy działa na buforach wyjściowych. Nie jestem dostatecznie zaznajomiony z buforowaniem wyjściowym, aby ustalić, czy możemy przetestować go w ten sam sposób. Po prostu niechętnie wychodzę poza dokumentację - jeśli jej zachowanie jest przypadkowe, a nie deterministyczne, ryzykuję sporo uszkodzonych danych. Byłem na tej drodze, więc jestem ostrożny. :) – Iterator

+0

Po dalszych testach nie uważam, że 'isIncomplete()' działa dla obiektów 'bigmemory': Wygląda na to, że obiekty są raczej wskaźnikami niż połączeniami. :( – Iterator

+0

Dzięki za sugestię i przykład Okazuje się, że w tym przypadku bufory są obsługiwane poza R. – Iterator

Powiązane problemy