Dlaczego kopiowanie tej samej ilości danych zajmuje więcej czasu, jeśli jest rozłożone na wiele oddzielnych plików?
12
Zauważyłem, że kopiowanie danych o wartości 24 Mb z jednego folderu do drugiego zajęło około 30 sekund, ponieważ (zakładam, że to jest powód) było to ponad 1000 oddzielnych plików. Kopiowanie 24Mb nie powinno zająć tak długo. Dlaczego liczba plików jest inna?
Korzystam z systemu Windows 7 na komputerze MacBook (4 GB pamięci RAM, procesor Intel (R) Core (TM) 2 Duo P7450 @ 2,13 GHz, 32-bitowy system operacyjny)
Dysk twardy nie ma dokładnej prędkości transferu, zależy to od właściwej konserwacji, tzn. Nie jest podzielony, nie ma uszkodzonych sektorów itp.
Jeśli HDD to SATA 2 i jest to ta sama partycja, to tylko prędkość transferu danych.
Jeśli na tym samym dysku twardym znajdują się dwie partycje, transfer danych między magistralą a płytą główną nie jest wymagany, tzn. Ładuje się do bufora. (następnie zależy od rozmiaru bufora dysku twardego).
Ale dla każdego skopiowanego pliku system musi zachować swój indeks w MFT (Master File Table) dysku twardego, co powoduje spowolnienie procesu kopiowania, jeśli skopiujesz wiele plików. A jeśli masz program antywirusowy, skanuje on każdy skopiowany plik. A jeśli włączyłeś indeksowanie plików wyszukiwania Microsoft (lub inną usługę indeksowania plików), wynik będzie gorszy.
Myślę, że musi istnieć wiele innych powodów, dla których kopiowanie wielu plików jest wolniejsze, ale to powinny być główne.
Wyłączenie programu antywirusowego przyspieszyło ekstrakcję 10 razy. Następnie przeskanowałem pliki w poszukiwaniu wirusów.
fat_mike 27.11.16
30
Dlaczego liczba plików jest inna?
Najwyraźniej skupiasz się wyłącznie na aspekcie „skopiuj dane” „skopiuj plik”. Plik to coś więcej niż tylko dane; jest to jednostka w systemie plików . Plik ma nazwę, atrybuty i uprawnienia. Wszystkie te dodatkowe informacje o pliku muszą zostać powielone wraz z danymi podczas „kopiowania pliku”. Istnieje znaczna ilość operacji we / wy na dysku, aby wykonać ten narzut systemu plików.
Procedura kopiowania jednego (1) pliku w ogólnym systemie plików wyglądałaby następująco:
Znajdź plik źródłowy w systemie plików. (za)
Odczytaj z dysku pozycję katalogu dla pliku źródłowego.
Sprawdź uprawnienia do odczytu.
Znajdź plik docelowy w systemie plików. (b)
Sprawdź uprawnienia do zapisu w katalogu docelowym.
W razie potrzeby rozwiń katalog, aby uwzględnić nowy plik. (do)
Zaktualizuj katalog na dysku. (c1)
Znajdź bezpłatne bloki, przydziel je i ponownie zaktualizuj tabelę. (re)
Odczytaj dane pliku i skopiuj do pliku docelowego (tj. Skopiuj „plik”).
Zaktualizuj pozycję katalogu dla nowego pliku za pomocą (rozmiar i czas). (mi)
Zaktualizuj czas dostępu do katalogu źródłowego. (fa)
(a) Oznacza to przynajmniej przeszukiwanie bieżącego katalogu. Lub ścieżka może zaczynać się w katalogu głównym systemu plików i należy przejść przez kilka poziomów katalogów.
(b) Oznacza to przynajmniej przeszukiwanie bieżącego katalogu. Lub ścieżka może zaczynać się w katalogu głównym systemu plików i należy przejść przez kilka poziomów katalogów. Jeśli plik docelowy już istnieje, określ sposób kontynuowania lub przerywania kopiowania. Jeśli plik docelowy nie istnieje, należy utworzyć nowy wpis w katalogu, a być może wiąże się to z rozszerzeniem katalogu (tj. Narzutem alokacji bloków plików (inaczej klaster) ).
(c) Jeśli katalog musi zostać rozszerzony, przydziel nowy blok, znajdując wolny blok, zmodyfikuj tabelę alokacji za pomocą nowego przydziału, a następnie wypisz bloki na dysk. Ponieważ większość systemów plików utrzymuje wiele kopii tabeli alokacji, oznacza to, że wiele zapisów na dysk. (c1) Po zlokalizowaniu katalogu docelowego odczytaj blok katalogu z dysku, zmodyfikuj go za pomocą nowego wpisu katalogu dla skopiowanego pliku, a następnie wypisz blok na dysk.
(d) Aby skopiować plik, alokuj bloki, znajdując wolne bloki, zmodyfikuj tabelę alokacji za pomocą nowych alokacji, a następnie wypisz bloki na dysk. Ponieważ większość systemów plików utrzymuje wiele kopii tabeli alokacji, oznacza to, że wiele zapisów na dysk. Aby zachować integralność danych, system plików nie może próbować łączyć (opóźniać i scalać) operacji zapisu na dysku dla katalogów i tabel alokacji, ale raczej wykonywać operacje zapisu natychmiast po utworzeniu nowych plików i przydzieleniu bloku.
(e) Po zakończeniu kopiowania danych zaktualizuj nowy wpis katalogu dla skopiowanego pliku, podając odpowiednią długość pliku i znaczniki czasu, a następnie wypisz blok katalogu na dysk.
(f) Zaktualizuj pozycję katalogu źródłowego nowym znacznikiem czasu „dostępu”, a następnie zapisz blok katalogu na dysku.
Więc zamiast tylko jednego pliku, pytanie brzmi: czy wykonanie tych wszystkich czynności dla tysiąca plików może wydłużyć czas potrzebny na skopiowanie części danych? Jeśli skopiujesz tylko jeden plik o rozmiarze 24 MB, będziesz mieć coś do porównania z czasem kopiowania tysiąca plików.
Podczas tworzenia kopii zapasowej systemu plików rzadko stosuje się kopiowanie pojedynczych plików do innego systemu plików na dysku lub partycji, ponieważ, jak odkryłeś, jest to raczej powolny proces. Szybszą metodą jest utworzenie i zapisanie pojedynczego pliku archiwum , który przechowuje pozycje katalogu źródłowego i zawartość pliku w specjalnym formacie; programy do tworzenia kopii zapasowych i komenda * nix „tar” mogą wyświetlać taki plik archiwum. (Uwaga: „tar” obsługuje tylko pliki archiwów i nie używa kompresji, takiej jak narzędzia do archiwizacji i kompresji.) Najszybszą metodą tworzenia kopii zapasowych jest zapis do urządzenia blokowego (a nie systemu plików na urządzeniu), tak aby źródłowy system plików był zignorowany (traktowany jako więcej danych), można wykonać kopię obrazu urządzenia źródłowego blok po bloku.
(pamiętajcie, drogi internetie, że analogie są błędne. Zachęcamy do wskazania tego w komentarzach).
Założenia:
Agent przekazujący informacje ==jakieś dziecko, nazwijmy go Samem, przenosi jajka z jednego koszyka do drugiego.
Wydaje mi się, że to medium do przesyłania informacji ==. Nie bardzo ważne tutaj.
Jajka pochodzą od różnych gatunków, w tym od ... dinozaurów ... i mitycznych podwodnych dna morskiego i smoków. (jajka mogą być naprawdę duże)
Wielkość jaja wielkości pliku ==. Pomyśl o jajku robbina kontra jajku Draggona.
Analogia:
Więc Sam musi przenosić jajka z jednego koszyka do drugiego, ponieważ pracuje na farmie, a ktokolwiek zleca mu zadania, jest wredny. Na farmie znajdują się różne zwierzęta składające jaja, w tym smoki i mityczne zwierzęta morskie; Sam uważa, że jest to niesamowite z kilku powodów. (niezbyt ważne, ale taka jest moja analogia)
Sam jest wyluzowany nad rzeką ze swoimi 2 koszami, jeden z koszy jest w tym z jajkami. Jajka w koszyku mają wielkość od
jajko robbina zajmuje 100 bytesmiejsce w koszu
do
Jajka Kraken, wielkości 2.7Gb.
Sam musi zacząć przenosić jajka, więc po prostu zaczyna chwytać jajka i je przenosić. Powiedzmy, że postanawia najpierw przenieść jajo smoka. Teraz jajko jest niezwykle masywne i gęste, więc zabranie go do drugiego kosza zajmuje trochę czasu.
Sam wkłada jajo smoka do drugiego kosza i jest wkurzony. To było trudne, ponieważ zajmowało tyle miejsca; przeniesienie go zajęło wiele czasu, by dostać tylko jedno jajko.
Sam jest głupcem.
Sam wraca do swojego pierwszego kosza, by złapać kolejne jajko. Zdaje sobie sprawę, że tak naprawdę miał tylko 1 duży. Zostało jednak 100 000 000 000 jaj robbina.
Jak widać popołudnie Sama jest zrujnowane. Jego naturalną skłonnością byłoby to, że dino-jajko powinno być znacznie gorsze, aby mógł się poruszać. Ma to sens, gdy mówimy o jajach i koszach, ale komputery mają liczbę 100 000 000 000.
W skrócie:
Odpowiedź na pytanie, dlaczego przeniesienie kilku małych plików zajmuje dużo więcej czasu w porównaniu do kilku dużych, wiąże się z kosztami związanymi z przeniesieniem ich. Im więcej masz małych plików, tym więcej razy trzeba będzie wykonać akcję. Innym sposobem spojrzenia na to byłoby mówienie o gęstości informacji.
W systemie plików NTFS wszystkie dane pliku - nazwa pliku, data utworzenia, uprawnienia dostępu i zawartość - są przechowywane jako metadane w głównej tabeli plików. Główna tabela plików (MFT) zawiera metadane dotyczące każdego pliku, katalogu i metapliku na woluminie NTFS. Obejmuje nazwy plików, lokalizacje, rozmiar i uprawnienia. Pozycja katalogu składa się z nazwy pliku i „identyfikatora pliku”, który jest numerem rekordu reprezentującym plik w głównej tabeli plików. Identyfikator pliku zawiera również liczbę ponownych użyć w celu wykrycia nieaktualnych referencji.
Lazy Badger
Czy twoja odpowiedź na pytanie opiera się na fakcie, że musi wykonać tyle dodatkowej pracy, tworząc rekordy dla nazwy pliku, lokalizacji, rozmiaru, uprawnień itp.? Stąd cała dodatkowa praca.
Najwyraźniej skupiasz się wyłącznie na aspekcie „skopiuj dane” „skopiuj plik”. Plik to coś więcej niż tylko dane; jest to jednostka w systemie plików . Plik ma nazwę, atrybuty i uprawnienia. Wszystkie te dodatkowe informacje o pliku muszą zostać powielone wraz z danymi podczas „kopiowania pliku”. Istnieje znaczna ilość operacji we / wy na dysku, aby wykonać ten narzut systemu plików.
Procedura kopiowania jednego (1) pliku w ogólnym systemie plików wyglądałaby następująco:
(a) Oznacza to przynajmniej przeszukiwanie bieżącego katalogu. Lub ścieżka może zaczynać się w katalogu głównym systemu plików i należy przejść przez kilka poziomów katalogów.
(b) Oznacza to przynajmniej przeszukiwanie bieżącego katalogu. Lub ścieżka może zaczynać się w katalogu głównym systemu plików i należy przejść przez kilka poziomów katalogów. Jeśli plik docelowy już istnieje, określ sposób kontynuowania lub przerywania kopiowania. Jeśli plik docelowy nie istnieje, należy utworzyć nowy wpis w katalogu, a być może wiąże się to z rozszerzeniem katalogu (tj. Narzutem alokacji bloków plików (inaczej klaster) ).
(c) Jeśli katalog musi zostać rozszerzony, przydziel nowy blok, znajdując wolny blok, zmodyfikuj tabelę alokacji za pomocą nowego przydziału, a następnie wypisz bloki na dysk. Ponieważ większość systemów plików utrzymuje wiele kopii tabeli alokacji, oznacza to, że wiele zapisów na dysk.
(c1) Po zlokalizowaniu katalogu docelowego odczytaj blok katalogu z dysku, zmodyfikuj go za pomocą nowego wpisu katalogu dla skopiowanego pliku, a następnie wypisz blok na dysk.
(d) Aby skopiować plik, alokuj bloki, znajdując wolne bloki, zmodyfikuj tabelę alokacji za pomocą nowych alokacji, a następnie wypisz bloki na dysk. Ponieważ większość systemów plików utrzymuje wiele kopii tabeli alokacji, oznacza to, że wiele zapisów na dysk. Aby zachować integralność danych, system plików nie może próbować łączyć (opóźniać i scalać) operacji zapisu na dysku dla katalogów i tabel alokacji, ale raczej wykonywać operacje zapisu natychmiast po utworzeniu nowych plików i przydzieleniu bloku.
(e) Po zakończeniu kopiowania danych zaktualizuj nowy wpis katalogu dla skopiowanego pliku, podając odpowiednią długość pliku i znaczniki czasu, a następnie wypisz blok katalogu na dysk.
(f) Zaktualizuj pozycję katalogu źródłowego nowym znacznikiem czasu „dostępu”, a następnie zapisz blok katalogu na dysku.
Więc zamiast tylko jednego pliku, pytanie brzmi: czy wykonanie tych wszystkich czynności dla tysiąca plików może wydłużyć czas potrzebny na skopiowanie części danych? Jeśli skopiujesz tylko jeden plik o rozmiarze 24 MB, będziesz mieć coś do porównania z czasem kopiowania tysiąca plików.
Podczas tworzenia kopii zapasowej systemu plików rzadko stosuje się kopiowanie pojedynczych plików do innego systemu plików na dysku lub partycji, ponieważ, jak odkryłeś, jest to raczej powolny proces. Szybszą metodą jest utworzenie i zapisanie pojedynczego pliku archiwum , który przechowuje pozycje katalogu źródłowego i zawartość pliku w specjalnym formacie; programy do tworzenia kopii zapasowych i komenda * nix „tar” mogą wyświetlać taki plik archiwum. (Uwaga: „tar” obsługuje tylko pliki archiwów i nie używa kompresji, takiej jak narzędzia do archiwizacji i kompresji.) Najszybszą metodą tworzenia kopii zapasowych jest zapis do urządzenia blokowego (a nie systemu plików na urządzeniu), tak aby źródłowy system plików był zignorowany (traktowany jako więcej danych), można wykonać kopię obrazu urządzenia źródłowego blok po bloku.
źródło
Oto analogia pojęciowa:
(pamiętajcie, drogi internetie, że analogie są błędne. Zachęcamy do wskazania tego w komentarzach).
Założenia:
==
jakieś dziecko, nazwijmy go Samem, przenosi jajka z jednego koszyka do drugiego.==
. Nie bardzo ważne tutaj.==
. Pomyśl o jajku robbina kontra jajku Draggona.Analogia:
Więc Sam musi przenosić jajka z jednego koszyka do drugiego, ponieważ pracuje na farmie, a ktokolwiek zleca mu zadania, jest wredny. Na farmie znajdują się różne zwierzęta składające jaja, w tym smoki i mityczne zwierzęta morskie; Sam uważa, że jest to niesamowite z kilku powodów. (niezbyt ważne, ale taka jest moja analogia)
Sam jest wyluzowany nad rzeką ze swoimi 2 koszami, jeden z koszy jest w tym z jajkami. Jajka w koszyku mają wielkość od
100 bytes
miejsce w koszudo
2.7Gb
.Sam musi zacząć przenosić jajka, więc po prostu zaczyna chwytać jajka i je przenosić. Powiedzmy, że postanawia najpierw przenieść jajo smoka. Teraz jajko jest niezwykle masywne i gęste, więc zabranie go do drugiego kosza zajmuje trochę czasu.
Sam wkłada jajo smoka do drugiego kosza i jest wkurzony. To było trudne, ponieważ zajmowało tyle miejsca; przeniesienie go zajęło wiele czasu, by dostać tylko jedno jajko.
Sam jest głupcem.
Sam wraca do swojego pierwszego kosza, by złapać kolejne jajko. Zdaje sobie sprawę, że tak naprawdę miał tylko 1 duży. Zostało jednak 100 000 000 000 jaj robbina.
Jak widać popołudnie Sama jest zrujnowane. Jego naturalną skłonnością byłoby to, że dino-jajko powinno być znacznie gorsze, aby mógł się poruszać. Ma to sens, gdy mówimy o jajach i koszach, ale komputery mają liczbę 100 000 000 000.
W skrócie:
Odpowiedź na pytanie, dlaczego przeniesienie kilku małych plików zajmuje dużo więcej czasu w porównaniu do kilku dużych, wiąże się z kosztami związanymi z przeniesieniem ich. Im więcej masz małych plików, tym więcej razy trzeba będzie wykonać akcję. Innym sposobem spojrzenia na to byłoby mówienie o gęstości informacji.
źródło
Czytaj FAT, zmieniaj położenie głowic, otwieraj plik przy zmianie pliku - wszystko to wymaga czasu
źródło