2017-02-22 43 views
0

Я создал сценарий Python, который использует библиотеку checksumdir (https://github.com/cakepietoast/checksumdir) для вычисления хешей MD5 на основе содержимого каталога. Вычисление этого хеша для каталога 350 МБ, расположенного на механическом жестком диске, занимает несколько секунд.Сколько времени нужно вычислить, полученное из содержимого каталога?

Вычисление хеша для каталога 30gb однако требует возраста. Я еще не закончил, я обнаружил, что 12 часов слишком долго. Я понятия не имею, что может вызвать это, я могу подумать, что каталог в 350 Мбайт подходит для моей памяти RAM, а 30 ГБ - нет. Размер блока в контрольной сумме кажется 64 * 1024 (65536), и из того, что я нашел с Google, это кажется разумным числом.

Я также нашел, что 350mbdir содержит 466 файлов, в то время как каталог 30gb содержит 22696 файлов. Если я экстраполирую то, что я все еще не могу объяснить лишнее время.

FWIW: Я хочу использовать скрипт для поиска каталогов с дублирующимся содержимым. Я не нашел приложения, которое это делает. Поэтому я хочу рассчитать хэши и показать конечный результат в файле HTML.

Соответствующий код:

#!/usr/bin/env python3 

import os 
import re 
from checksumdir import dirhash # https://pypi.python.org/pypi/checksumdir/1.0.5 
import json 
import datetime 


now = datetime.datetime.now().strftime("%Y-%m-%d_%H:%M") 
results = {} 
sorted_results = {} 
single_entries = [] 
compare_files = False 
compare_directories = True 
space_to_save = 0 
html_overview = [] 
html_overview.extend(['<!DOCTYPE html>','<html>','<head>','<link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">','</head>','<body>',' <table style="width:90%" class="table table-hover table-striped">', '  <tr>','   <td colspan=4></td>','  </tr>']) 

# Configuration 
root = "/home/jeffrey/Documenten" # Root directory to start search 
create_hash = True 
calculate_file_folder_size = True 
compare_file_folder_names = False 
sort_by = "hash" # Options: hash, size, name 
json_result_file = 'result_' + now + '.json' 
html_result_file = "DuplicatesHtml-" + now + ".html" 
only_show_duplicate_dirs = True 
remove_containing_directories = True 
verbose_execution = True 

# Calculate size of directory recursively - http://stackoverflow.com/questions/1392413/calculating-a-directory-size-using-python 
def get_size(start_path = '.'): 
    total_size = 0 
    for dirpath, dirnames, filenames in os.walk(start_path): 
     for f in filenames: 
      fp = os.path.join(dirpath, f) 
      total_size += os.path.getsize(fp)/1048576 # size from bytes to megabytes 
    return total_size 


# Calculate comparison properties, sort and save based on os.walk for recursive search 
for dirName, subdirList, fileList in os.walk(root): 
    for dir in subdirList:  
     dir_name = dir 
     dir = os.path.join(dirName, dir) 
     if dir[0] != ".": 
      if verbose_execution = True: 
       print(dir) 
      if calculate_file_folder_size == True: 
       size = get_size(dir)  
       if verbose_execution = True: 
        print(size) 
      if create_hash == True: 
       hash = dirhash(dir, 'md5') 
       if verbose_execution = True: 
        print(hash)  
      results[dir] = [dir_name, size, hash] 

ответ

0

Итак, я обнаружил, что один файл был более или менее просто висит процесс. Я нашел это, используя другую функцию Python для вычисления хэшей с подробным выходом. Когда я удалил этот файл (мне это не нужно, что-то в каталоге AppData в Windows), все работало нормально. Для справок в будущем: около 900 гб данных потребовалось полдня для обработки, используя второе соединение i5 и SATA. Я подозреваю, что I/O будет шеей бутылки здесь. Но это время, которое я ожидаю.