alex783
02-11-2009, 08:21
Ciao a tutti!
Ieri sera ho scritto una classe per realizzare il backup incrementale di una cartella in formato ZIP (utilizzando l'ottimo DotNetZip di Dino Chiesa ( :ave: )), solo che sono rimasto abbastanza deluso dalle prestazioni di ciò che ho fatto.
In particolare, usando la cartella del profilo di Thunderbird come test (la mia "pesa" circa 650MB e contiene circa 6500 files e poco più di 80 cartelle totali), il primo backup completo (del peso finale di 340MB) è realizzato in 3 minuti e 23 secondi (e questo dimostra la bontà della libreria DotNetZip, con prestazioni paragonabili ai più noti ZIP engine), mentre i backup successivi, quindi del tipo incrementale, sono completati in circa 2 minuti e 35 secondi per un peso di circa 160MB ciascuno (questo perché basta ricevere solo un'email e Thuderbird modifica il file Inbox del relativo account e quindi va segnato per il backup (in genere è un file piuttosto grande).
Bene. Mi sono accorto che durante i backup incrementali, la mia classe perde ben 1 minuto e 17 secondi per determinare (attraverso un ciclo foreach) quali sono i file da includere nel nuovo file ZIP. Ed è qui che, secondo me, perde davvero troppo tempo.
Ecco il mio codice, che poi non è nulla di che, ovviamente.
using (ZipFile NewZip = new ZipFile())
{
ZipFile OldZip = ZipFile.Read(nameOfZipFile)
NewZip.UseZip64WhenSaving = Zip64Option.AsNecessary;
NewZip.CompressionLevel = CompressionLevel.Level2;
NewZip.UseUnicodeAsNecessary = true;
foreach (FileInfo currentFileOnDisk in FileList)
{
ZipEntry candidateZipEntry = OldZip[currentFileOnDisk.FullName.Replace(mailclientsClass.thunderbirdProfilePath, "ThunderbirdProfile")];
if (candidateZipEntry != null && currentFileOnDisk.LastWriteTimeUtc > candidateZipEntry.ModifiedTime)
NewZip.AddFile(currentFileOnDisk.FullName, Path.GetDirectoryName(currentFileOnDisk.FullName.Replace(mailclientsClass.thunderbirdProfilePath, "ThunderbirdProfile")));
else if (candidateZipEntry == null)
NewZip.AddFile(currentFileOnDisk.FullName, Path.GetDirectoryName(currentFileOnDisk.FullName.Replace(mailclientsClass.thunderbirdProfilePath, "ThunderbirdProfile")));
}
NewZip.Save(nameOfZipFile+incrementalCounter.ToString());
}
Secondo voi sbaglio qualcosa? come si potrebbe fare di meglio? :stordita:
P.S: la classe non è ovviamente completa, manca in particolare il controllo di eventuali file eliminati nella cartella origine, che dovrei realizzare con un altro ciclo foreach, e quindi immagino che perderà un altro minuto per il controllo :muro:
Ieri sera ho scritto una classe per realizzare il backup incrementale di una cartella in formato ZIP (utilizzando l'ottimo DotNetZip di Dino Chiesa ( :ave: )), solo che sono rimasto abbastanza deluso dalle prestazioni di ciò che ho fatto.
In particolare, usando la cartella del profilo di Thunderbird come test (la mia "pesa" circa 650MB e contiene circa 6500 files e poco più di 80 cartelle totali), il primo backup completo (del peso finale di 340MB) è realizzato in 3 minuti e 23 secondi (e questo dimostra la bontà della libreria DotNetZip, con prestazioni paragonabili ai più noti ZIP engine), mentre i backup successivi, quindi del tipo incrementale, sono completati in circa 2 minuti e 35 secondi per un peso di circa 160MB ciascuno (questo perché basta ricevere solo un'email e Thuderbird modifica il file Inbox del relativo account e quindi va segnato per il backup (in genere è un file piuttosto grande).
Bene. Mi sono accorto che durante i backup incrementali, la mia classe perde ben 1 minuto e 17 secondi per determinare (attraverso un ciclo foreach) quali sono i file da includere nel nuovo file ZIP. Ed è qui che, secondo me, perde davvero troppo tempo.
Ecco il mio codice, che poi non è nulla di che, ovviamente.
using (ZipFile NewZip = new ZipFile())
{
ZipFile OldZip = ZipFile.Read(nameOfZipFile)
NewZip.UseZip64WhenSaving = Zip64Option.AsNecessary;
NewZip.CompressionLevel = CompressionLevel.Level2;
NewZip.UseUnicodeAsNecessary = true;
foreach (FileInfo currentFileOnDisk in FileList)
{
ZipEntry candidateZipEntry = OldZip[currentFileOnDisk.FullName.Replace(mailclientsClass.thunderbirdProfilePath, "ThunderbirdProfile")];
if (candidateZipEntry != null && currentFileOnDisk.LastWriteTimeUtc > candidateZipEntry.ModifiedTime)
NewZip.AddFile(currentFileOnDisk.FullName, Path.GetDirectoryName(currentFileOnDisk.FullName.Replace(mailclientsClass.thunderbirdProfilePath, "ThunderbirdProfile")));
else if (candidateZipEntry == null)
NewZip.AddFile(currentFileOnDisk.FullName, Path.GetDirectoryName(currentFileOnDisk.FullName.Replace(mailclientsClass.thunderbirdProfilePath, "ThunderbirdProfile")));
}
NewZip.Save(nameOfZipFile+incrementalCounter.ToString());
}
Secondo voi sbaglio qualcosa? come si potrebbe fare di meglio? :stordita:
P.S: la classe non è ovviamente completa, manca in particolare il controllo di eventuali file eliminati nella cartella origine, che dovrei realizzare con un altro ciclo foreach, e quindi immagino che perderà un altro minuto per il controllo :muro: