Perché la copia della stessa quantità di dati impiega più tempo se distribuita su più file separati?


12

Ho notato che la copia di 24 Mb di dati da una cartella all'altra ha richiesto circa 30 secondi perché (suppongo che questo sia il motivo) erano oltre 1.000 file separati. La copia di 24 Mb non dovrebbe richiedere così tanto tempo. Perché il numero di file cambia?

Sto eseguendo Windows 7 su un MacBook (4 GB di RAM, CPU Intel (R) Core (TM) 2 Duo P7450 a 2,13 GHz, sistema operativo a 32 bit)

EDIT: NTFS è il file system utilizzato sull'unità

Risposte:


5

L'HDD non ha una velocità di trasferimento esatta, dipende da una corretta manutenzione, cioè non è frammentata, né presenta settori danneggiati, ecc ...

Se l'HDD è SATA 2 ed è la stessa partizione, è solo la velocità di trasferimento dei dati.

Se ci sono due partizioni nello stesso HDD, non è necessario questo trasferimento di dati tra bus e scheda madre, ovvero viene caricato nel buffer. (quindi dipende dalla dimensione del buffer hdd.)

Ma per ogni file copiato, il sistema deve mantenere il proprio indice nella MFT (Master File Table) dell'HDD, il che rende più lento il processo di copia se si copiano molti file. E se hai qualche antivirus, eseguirà la scansione di ogni file che viene copiato. E se hai abilitato l'indicizzazione dei file di ricerca di Microsoft (o qualsiasi altro servizio di indicizzazione dei file), il risultato sarà peggiore.

Penso che ci debbano essere molti altri motivi per cui la copia di molti file è più lenta, ma questi dovrebbero essere i principali.


La disabilitazione del programma antivirus ha reso l'estrazione 10 volte più veloce. Dopo di che ha scansionato i file alla ricerca di virus.
fat_mike,

30

Perché il numero di file cambia?

Apparentemente ti stai concentrando esclusivamente sull'aspetto "copia i dati" di "copia un file". Un file è più di un semplice dato; è un'entità in un filesystem . Un file ha un nome, attributi e autorizzazioni. Tutte queste informazioni aggiuntive sul file devono essere duplicate insieme ai dati quando il "file viene copiato". Esiste una quantità significativa di I / O su disco per eseguire questo sovraccarico del filesystem.

La procedura per copiare un (1) file in un filesystem generico sarebbe qualcosa del tipo:

  • Trova il file sorgente nel filesystem. (un)
  • Leggere dal disco la voce della directory per il file di origine.
  • Verifica i permessi di lettura.
  • Trova il file di destinazione nel filesystem. (B)
  • Verifica le autorizzazioni di scrittura nella directory di destinazione.
  • Espandere la directory, se necessario, per accogliere il nuovo file. (C)
  • Aggiorna la directory su disco. (C1)
  • Trova blocchi gratuiti, allocali e aggiorna nuovamente la tabella. (D)
  • Leggere i dati del file e copiarli nel file di destinazione (ovvero copiare il "file").
  • Aggiorna la voce della directory per il nuovo file con (dimensione e ora). (E)
  • Aggiorna il tempo di accesso della voce della directory di origine. (F)

(a) Almeno questo significa cercare la directory corrente. Oppure il percorso potrebbe iniziare dalla radice del filesystem e devono essere attraversati diversi livelli di directory.

(b) Almeno questo significa cercare la directory corrente. Oppure il percorso potrebbe iniziare dalla radice del filesystem e devono essere attraversati diversi livelli di directory. Se il file di destinazione esiste già, quindi determinare come procedere o interrompere la copia. Se il file di destinazione non esiste, è necessario creare una nuova voce di directory, e forse ciò comporta l'espansione della directory (ovvero l' overhead di allocazione del blocco di file (aka cluster) ).

(c) Se la directory deve essere espansa, allocare un nuovo blocco trovando un blocco libero, modificare la tabella di allocazione con la nuova allocazione, quindi scrivere i blocchi sul disco. Poiché la maggior parte dei filesystem mantiene più copie della tabella di allocazione, ciò significa che più scritture su disco.
(c1) Una volta individuata la directory di destinazione, leggere il blocco di directory dal disco, modificarlo con la nuova voce di directory per il file copiato, quindi scrivere il blocco sul disco.

(d) Per copiare il file, allocare i blocchi trovando blocchi liberi, modificare la tabella di allocazione con le nuove allocazioni, quindi scrivere i blocchi sul disco. Poiché la maggior parte dei filesystem mantiene più copie della tabella di allocazione, ciò significa che più scritture su disco. Per mantenere l'integrità dei dati, il filesystem potrebbe non tentare di unire (ritardare e unire) le operazioni di scrittura su disco per directory e tabelle di allocazione, ma piuttosto eseguire le operazioni di scrittura immediatamente quando i nuovi file vengono creati e allocati a blocchi.

(e) Una volta che la copia dei dati è conforme, aggiornare la nuova voce della directory per il file copiato con la lunghezza e il timestamp del file corretti, quindi scrivere il blocco della directory sul disco.

(f) Aggiorna la voce della directory di origine con un nuovo timestamp di "accesso" e quindi scrivi il blocco della directory sul disco.

Quindi, invece di un solo file, la tua domanda è se fare tutto questo per mille file potrebbe aumentare il tempo necessario per copiare solo la parte di dati dei file? Se copi solo un file di 24 MB, avrai qualcosa da confrontare con il tempo di copia di mille file.

Quando si esegue il backup di un file system, la copia dei singoli file su un altro file system su un disco o una partizione viene utilizzata raramente perché è un processo piuttosto lento, come è stato scoperto. Un metodo più veloce è quello di creare e scrivere un singolo file di archivio che contiene le voci della directory di origine e il contenuto del file in un formato file speciale; i programmi di backup e il comando * nix 'tar' possono generare un simile file di archivio. (Si noti che 'tar' gestisce solo i file di archivio e non usa la compressione come archivio + utilità di compressione.) Il metodo più veloce di backup è scrivere su un dispositivo a blocchi (piuttosto che un filesystem su un dispositivo), in modo che il filesystem di origine sia ignorato (trattato come più dati) e può essere eseguita una copia immagine blocco per blocco del dispositivo sorgente.


-1

Ecco un'analogia concettuale:

(per favore ricorda cara Internet, che le analogie sono imperfette. Sentiti libero di sottolineare come nei commenti.)

ipotesi:

  • L'agente di trasferimento di informazioni di == un bambino, chiamiamolo Sam, sta spostando le uova da un cestino all'altro.
  • Il mezzo di trasferimento delle informazioni == dell'aria immagino. Non molto importante qui.
  • Le uova provengono da varie specie, tra cui come ... dinosauri ... e mitiche creature marine e draghi sottomarini. (le uova possono essere davvero grandi)
  • Volume dell'uovo di dimensioni file == . Pensa all'uovo di Robbin contro l'uovo di Draggon.

Analogia:

Quindi Sam deve spostare le uova da un cestino all'altro perché lavora in una fattoria e chiunque gli dia dei compiti è cattivo. Ci sono vari animali che depongono le uova in questa fattoria, tra cui draghi e mitiche bestie marine; Sam pensa che sia fantastico per diversi motivi. (non molto importante, ma questa è la mia analogia)
Sam si sta rilassando vicino al fiume con i suoi 2 cestini, uno dei cestini è quello con dentro le uova. Le uova nel cestino variano in dimensioni da

  • un uovo di ladro che occupa 100 bytesspazio nel cestino

per

  • Kraken-uova, dimensionate intorno 2.7Gb.

Sam deve iniziare a spostare le uova, quindi inizia a prendere le uova e spostarle. Diciamo che decide di spostare prima un uovo di drago. Ora l'uovo è estremamente massiccio e denso, quindi gli ci vuole un po 'di tempo per tirare la cosa nell'altro cestino.
Sam prende l'uovo di drago nell'altro cestino ed è incazzato. È stato difficile perché la cosa ha occupato così tanto spazio; il suo spostamento ha richiesto molto tempo per un solo uovo.

Sam è un pazzo.

Sam torna al suo primo cestino per prendere un altro uovo. Si rende conto di averne avuto solo 1 grande. Rimangono tuttavia 100.000.000.000 di uova di robbin.

Come puoi vedere, il pomeriggio di Sam è rovinato. La sua naturale inclinazione sarebbe che l'uovo-dinosauro dovesse essere molto peggio per lui di dover muoversi. Ciò ha senso quando parliamo di uova e cestini, ma i computer trattano numeri come 100.000.000.000.

In breve:

La risposta sul perché ci vuole molto più tempo per spostare diversi file di piccole dimensioni rispetto a pochi file di grandi dimensioni, ha a che fare con il costo associato all'azione di spostarli. Più file di piccole dimensioni si hanno, più volte sarà necessario preformare l'azione. Un altro modo di vedere questo sarebbe parlare della densità delle informazioni.


-2

Leggi FAT, riposiziona le testine, apri il file al cambio del file: tutto richiede tempo


È un'unità NTFS
Trindaz,

In NTFS, tutti i dati dei file - nome file, data di creazione, permessi di accesso e contenuti - sono memorizzati come metadati nella tabella dei file master. La tabella dei file master (MFT) contiene metadati su ogni file, directory e metafile su un volume NTFS. Include nomi di file, posizioni, dimensioni e autorizzazioni. Una voce della directory è composta da un nome file e un "ID file" che è il numero di record che rappresenta il file nella tabella dei file master. L'ID file contiene anche un conteggio di riutilizzo per rilevare riferimenti non aggiornati.
Lazy Badger,

Quindi la tua risposta alla domanda si basa sul fatto che deve fare così tanto lavoro extra per creare record per il nome del file, posizione, dimensione, permessi ecc? Ecco da dove proviene tutto il lavoro extra.
Trindaz,

Creazione di nuovi e lettura esistente
Lazy Badger
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.