2011-08-08 12 views
22

Czy istnieje duża różnica wydajności pomiędzy:rur vs Temporary File

  • Procesu piśmie do pliku tymczasowego, a proces B czytania tego pliku
  • proces piśmie do rury, a proces B czytanie z tej rury

Jestem ciekawa, jaka jest odpowiedź dla systemu Windows i * nix.

EDYTOWANIE: Powinienem był zapytać: Czy pamięć podręczna bufora eliminuje różnicę między plikiem tymczasowym a potokiem?

Odpowiedz

29

Jedną z dużych różnic jest to, że z rurami procesy A i B mogą być uruchomione jednocześnie, więc B zacznie działać na wyjściu z A przed zakończeniem jego produkcji. Co więcej, rozmiar rury jest ograniczony, więc A nie będzie w stanie wytworzyć znacznie więcej danych niż zużywa B; zostanie zmuszony do czekania, aż B go dogoni.

Jeśli objętość danych jest duża, pisanie do pliku tymczasowego wiąże się z działaniem dysku, nawet jeśli służy tylko do tworzenia, a następnie niszczenia pliku. Dane mogą pozostać w puli buforów w pamięci - więc nie ma tam żadnych I/O dysku - nawet w przypadku zaskakująco dużych plików. Pisanie do fajki "nigdy" pociąga za sobą zapis na dysku.

+0

+1 - Jedyną rzeczą, na którą nie udzielono jednoznacznej odpowiedzi, jest to samo dla systemu Windows i systemu Unix. (Wątpię, czy byłaby różnica, ale było to w pierwotnym pytaniu.) – OverZealous

+0

@OverZealous: punkt fair. Moja odpowiedź dotyczy bardziej niezawodnie w systemie Unix niż Windows. Windows czasami osiąga w przybliżeniu ten sam wynik nieco inaczej niż Unix, ale myślę, że moje punkty są poprawne w systemie Windows. Jestem mniej pewny, że rura Windows nigdy nie wymaga zapisywania na dysku. –

8

Główna różnica polega na tym, że pierwsza metoda faktycznie wykorzystuje pamięć na dysku, podczas gdy rura będzie używać pamięci (chyba że staniesz się naprawdę pedantyczna i zaczniesz myśleć o przestrzeni wymiany).

Wydajność, pamięć jest szybsza niż dysk (prawie zawsze). Powinno to być generalnie prawdziwe we wszystkich systemach operacyjnych.

Jedynym momentem, w którym użycie pliku tymczasowego ma sens, jest to, że proces B musi sprawdzać dane w wielu przebiegach (np. Niektóre rodzaje kodowania wideo). W tym celu cały strumień danych musiałby zostać zbuforowany, a gdyby było wystarczająco dużo danych, to prawdopodobnie zanegowałoby przewagę w pamięci. Tak więc dla operacji wieloprzebiegowych (wyszukiwania), idź z plikiem tymczasowym.

+1

Zobacz, zastanawiałem się, czy pamięć podręczna dysku wyeliminuje różnicę między rurami a plikiem tymczasowym. –

+2

Najważniejsze jest to, że podczas gdy proces A pisze do pliku *, proces B nie będzie działał (dopóki nie zostanie zrobiony). Podczas gdy proces A pisze do * rury *, proces B może od razu rozpocząć odczytywanie. Więc nawet jeśli system operacyjny zapisał w pamięci podręcznej cały plik, nadal musiałbyś poczekać, aż A zostanie ukończony. I tak, możliwe jest "strumieniowe" przesyłanie pliku (np. Tail -f), ale musisz jeszcze poczekać, aż A się spłukuje, zanim cokolwiek zobaczysz. Więc znowu użyj fajki, chyba że musisz robić seki. –

+0

@Chris Nie sądzę, że proces B musi poczekać, aż proces A spali się do pliku. Jeśli proces B rozpocznie czytanie pliku, nawet przed zakończeniem procesu A, nic złego się nie dzieje. żądanie B procesu zostanie spełnione z samego bufora. Nie trzeba czekać, aż zmiany zostaną zatwierdzone na dysku. Czy też się tutaj mylę? –

2

Jeśli nie rozumiem rur całkowicie w ścianie, odpowiedź brzmi TAK.

Zapisywanie do pliku tymczasowego wiąże się z dostępem do dysku i związanym z tym obciążeniem.

Zapisywanie do potoku i czytanie z niego odbywa się w pamięci. O wiele szybciej.

0

Pomyślałem, że praktyczna odpowiedź może pomóc. Szybko optymalizuję skrypt, którego używam, który ma około 4 kroków. Przygotowałem go do korzystania z metod rurociągów i innych metod. Jest to pod 64-bitowym systemem Windows 7.

Dostałem 3% spowolnienie za niestosowanie rurociągów. Co jest tego warte, dla mnie, ponieważ teraz mogę zatrzymać się pomiędzy poszczególnymi krokami i zaktualizować tytuł okna, którego nie mogłem, gdy było to tylko jedno polecenie.

Osobiście weźmie to 3% trafienie dla tytułów okien.

Dla ciekawości przekopuję plik> 20M, a następnie przekazuję go do specjalistycznego skryptu perla, który modyfikuje wyniki, a następnie sortuję je za pomocą okien zbudowanych w SORT.EXE, a następnie ujednolicam je za pomocą UNIQ.EXE cygwin'a, następnie powracaj do tych samych wyników, aby uzyskać kolorowanie grep-result oparte na ANSI. Większość czasu spędza się w fazie sortowania.

+0

Jakie tytuły okien omawiasz? Czy ta część przepływu, o której wspomniałeś w swojej odpowiedzi? – Cristik

+0

Tak, mam kilka skryptów, które zajmują kilka sekund, więc aktualizują tytuł okna tego okna wiersza poleceń, aby dać mi coś do oglądania [po zminimalizowaniu] i nie denerwują się, że może nic nie robić :) – ClintL

+0

Uwaga że polecenie sortowania jest blokerem dla współbieżności. Nie może wytworzyć żadnego wyjścia, dopóki nie przeczyta całego wejścia. Biorąc pod uwagę to i twoją uwagę, że większość czasu spędza się w fazie sortowania, nie jest zaskakujące, że otrzymałeś bardzo małą zmianę wydajności pomiędzy przepływem sterowania z wykorzystaniem potoków i nie. Jeśli Twój potok nie ma sortowania blokującego, możesz wykazać większe oszczędności czasu przetwarzania ze zwiększonej współbieżności. –