Dlaczego „kot” zachowuje się tak dziwnie?

8

Używam catdo łączenia różnych plików w jeden duży plik. Liczba różnych plików jest różna, od dwóch do dziesięciu, ale całkowity rozmiar wszystkich plików jest zawsze taki sam (kilka GB).

Mój problem: Ilekroć dochodzę do sprawy, w której mam w sumie sześć plików, czas potrzebny na połączenie ich szczytów (tj. Znacznie więcej niż z pięcioma lub siedmioma) i nie mam pojęcia, dlaczego.

Czy ktoś ma pomysł?

Pliki (wszystkie tego samego rozmiaru)

output
outputTEMP1
outputTEMP2
outputTEMP3
outputTEMP4
outputTEMP5

Komenda

cat outputTEMP* >> output && rm -f outputTEMP*

Obecnie maszyna musi wykonać pewne obliczenia, ale zaktualizuję ją później, gdy będą dostępne nowe pomiary.

brandstaetter
źródło
Jakiego wiersza poleceń używasz?
innaM
Dodałem wiersz poleceń.
brandstaetter
To zdecydowanie dziwne. Nie mogę ci powiedzieć, dlaczego tak się dzieje, ale być może powinieneś zgłosić zgłoszenie błędu w postaci zwykłego tekstu na adres [email protected].
Reynolds,
Zmierz to! I pamiętaj, że nie mierzysz pamięci podręcznej podczas pomiaru!
Davide,

Odpowiedzi:

4

Jednym ze sposobów debugowania tego problemu jest użycie strace.

strace -tt -e trace=open,close -o /tmp/strace.cat.log cat apt.list authors.txt >/tmp/t.test
cat /tmp/strace.cat.log 

23:12:08.022588 open("apt.list", O_RDONLY|O_LARGEFILE) = 3
23:12:08.023451 close(3)                = 0
23:12:08.023717 open("authors.txt", O_RDONLY|O_LARGEFILE) = 3
23:12:08.025403 close(3)                = 0

Opcja -tt rejestruje znacznik czasu wywołania systemowego do rozdzielczości milisekund. -e trace = otwórz, zamknij dziennik tylko otwórz, zamknij API. Spróbuj je usunąć, a zobaczysz bardzo głośny plik dziennika.

tony-p-lee
źródło
2

Więc komentarz Davidesa jest na miejscu. Potrzebujemy tutaj dwóch rzeczy, aby dokonać dokładnej oceny:

  1. buforowanie bezpieczeństwa nie jest częścią scenariusza
  2. rzeczywisty pomiar czasu potrzebnego.

Zakładając, że masz miejsce na dysku, opiszę scenariusz testowy, który pozwoli dokładniej określić, czy jest to prawdziwy problem. Jeśli tak, dowody potwierdzające to podejście pomogą programiście wiedzieć, że jest ono prawdziwe i będzie w stanie je odtworzyć.

Aby pomóc w izolacji problemu, nie róbmy tutaj wcale części rm. pozwól plikom TEMP później usiąść. Możesz następnie powtórzyć testy wykonując część „rm”, jeśli chcesz.

Oto scenariusz testowy:

  • utwórz 9 katalogów - po jednym dla każdej liczby plików (2 3 4 5 6 7 8 9 i 10) - jeśli nie masz miejsca, może po prostu zrób 2, 5, 6, 7 i 10.
  • upewnij się, że umieszczasz RÓŻNE pliki w każdym z tych katalogów; Nigdzie nie ma duplikatów
  • użyj komendy time w następujący sposób:

    czas (wyjście kota TEMP * >> wyjście)

Przechwytywanie liczb rzeczywistych, użytkowników i sys zgłoszonych dla każdego uruchomionego testu.

Zgadzam się z Reynoldsem; jeśli to prawda, zdecydowanie powinieneś wysłać szczegóły e-maila na [email protected].

pbr
źródło
Kolejna myśl: aby upewnić się, że kopiujesz taką samą CAŁKOWITĄ ilość danych do pliku wyjściowego. Tak więc, jeśli w sumie jest to 1 GB, w katalogu „2” byłyby pliki o wielkości 1/2 GB, aw katalogu „10” - pliki o wielkości
1/10