Chcete zlepšit tuto otázku? Přidejte podrobnosti a objasněte problém úpravou tohoto příspěvku.
Zavřeno před 6 lety.
Vylepšete tuto otázku
Mám velký soubor (2-3 GB, binární, nezdokumentovaný formát), který používám na dvou různých počítačích (normálně ho používám na stolním systému, ale když cestuji, dám si ho na svůj notebook). K přenosu tohoto souboru tam a zpět používám rsync.
Čas od času dělám malé aktualizace tohoto souboru, měním méně než 100 kB. To se děje v obou systémech.
Problém s rsync, jak tomu rozumím, je ten, že pokud si myslí, že se soubor změnil mezi zdrojem a cílem, přenese celý soubor. V mé situaci mi to přijde jako velká ztráta času, když se změní jen malá část souboru. Předpokládám protokol, kde přenosoví agenti na zdrojovém a cílovém místě nejprve zkontrolují celý soubor a poté porovnají výsledek. Když zjistí, že kontrolní součet pro celý soubor je jiný, rozdělí soubor na dvě části, A a B, a kontrolní součet je odděleně.
Aha, B je na obou strojích identické, tu polovinu ignorujme. Nyní rozdělí A na A1 a A2. Dobře, změnila se pouze A2. Rozdělte A2 na A2I a A2II a porovnejte atd. Dělejte to rekurzivně, dokud nenajde např. tři části, každá o velikosti 1 MB, které se liší mezi zdrojem a cílem, a pak přeneste pouze tyto části a vložte je na správnou pozici do cílového souboru. Dnes s rychlými SSD a vícejádrovými CPU by taková paralelizace měla být velmi efektivní.
Moje otázka tedy zní, jsou dnes k dispozici nějaké nástroje, které fungují takto (nebo jiným způsobem, který jsem si nedokázal představit, ale s podobným výsledkem)?
Byla odeslána žádost o vysvětlení. Většinou používám Mac, takže souborový systém je HFS+. Obvykle spouštím rsync takto
rsync -av --delete --progress --stats
– v těchto případech někdy používám SSH a někdy rsyncd. Když používám rsyncd, spustím to takto rsync --daemon --verbose --no-detach
.
Druhé upřesnění:Žádám buď o nástroj, který pouze přenese delta pro soubor, který existuje na dvou místech s malými změnami a/nebo jestli to rsync skutečně nabízí. Moje zkušenost s rsync je, že přenáší soubory v plném rozsahu (ale nyní existuje odpověď, která to vysvětluje:rsync potřebuje server rsync, aby mohl přenášet pouze deltas, jinak (např. pomocí ssh-shell) přenáší celý jakkoli se mnoho změnilo).
Související:Kdy byste použili další deskriptor souboru?Přijatá odpověď:
Rsync nebude používat deltas, ale přenese celý soubor jako celek, pokud je jako jediný proces zodpovědný za zdrojové a cílové soubory. Může přenášet delty, když na zdrojovém a cílovém počítači běží samostatný proces klienta a serveru.
Důvod, proč rsync neposílá delta, když je to jediný proces, je ten, že aby bylo možné určit, zda potřebuje odeslat delta, potřebuje přečíst zdrojové a cílové soubory. Ve chvíli, kdy to bude hotové, mohl soubor rovnou zkopírovat.
Pokud používáte příkaz tohoto formuláře, máte pouze jeden proces rsync:
rsync /path/to/local/file /network/path/to/remote/file
Pokud používáte příkaz tohoto formuláře, máte dva procesy rsync (jeden na místním hostiteli a jeden na vzdáleném) a lze použít deltas:
rsync /path/to/local/file remote_host:/path/to/remote/file