Potrzebuję funkcji inteligentnego kopiowania, aby zapewnić niezawodne i szybkie kopiowanie plików & łączenie. Pliki są bardzo duże (od gigabajtów do ponad 200 GB) i rozprowadzane przez wiele folderów, w których ludzie zmieniają nazwy plików, a może foldery w ciągu dnia, więc chcę użyć skrótów, aby sprawdzić, czy już skopiowałem plik, może pod inną nazwę i w takim przypadku utwórz tylko link.Czy ta "szybka funkcja" jest niebezpieczna?
Im całkowicie nowy w mieszaja i używam tej funkcji tutaj hash:
import hashlib
def calculate_sha256(cls, file_path, chunk_size=2 ** 10):
'''
Calculate the Sha256 for a given file.
@param file_path: The file_path including the file name.
@param chunk_size: The chunk size to allow reading of large files.
@return Sha256 sum for the given file.
'''
sha256 = hashlib.sha256()
with open(file_path, mode="rb") as f:
for i in xrange(0,16):
chunk = f.read(chunk_size)
if not chunk:
break
sha256.update(chunk)
return sha256.hexdigest()
ten trwa jedną minutę do pliku 3GB, więc w końcu, proces może być bardzo powolny do 16 TB HD.
Teraz moim pomysłem jest wykorzystanie dodatkowej wiedzy o wewnętrznej strukturze plików, aby przyspieszyć działanie: Wiem, że zawierają mały nagłówek, a następnie wiele danych pomiarowych i wiem, że zawierają znaczniki czasu w czasie rzeczywistym, więc Jestem pewien, że szansa, że, powiedzmy, pierwsze 16 MB dwóch plików jest identyczne, jest bardzo niska (aby tak się stało, dwa pliki musiałyby zostać utworzone dokładnie w tym samym czasie w dokładnie takich samych warunkach środowiskowych) . Więc mój wniosek jest taki, że powinno wystarczyć, aby zaszeregować tylko pierwsze X MB każdego pliku.
Działa na moich przykładowych danych, ale ponieważ jestem niedoświadczony, chciałem tylko zapytać, czy jest coś, czego nie jestem świadomy (ukryte niebezpieczeństwo lub lepszy sposób na zrobienie tego).
Dziękuję bardzo!
http://codereview.stackexchange.com/ – vaultah
Musisz albo zrobić matematykę i zobaczyć, jak prawdopodobne jest, że masz niezamierzoną kolizję, albo musisz w jakiś sposób zagwarantować, że różne pliki * zawsze mają * inny nagłówek . W tym ostatnim przypadku możesz * na pewno * sprawdzić sumę tylko nagłówka. W pierwszym przypadku musisz sam zdecydować, czy prawdopodobieństwo kolizji jest czymś, z czym możesz żyć, czy nie. Trudno jest pomóc bez znajomości danych. –
Możesz uniknąć ponownego odkrywania koła i używania [rsync] (http://en.wikipedia.org/wiki/Rsync). –