2017-11-14 2 views
2

Unten ist mein Code, um die Dateigröße in aufsteigender Reihenfolge zu erhalten.Python-Code-Leistung auf Big Data os.path.getsize

Dieser Code funktioniert, aber die Leistung ist langsam, wenn die Größe eines Verzeichnisses in TB oder PB ist. Jeder Vorschlag, den Code zu verbessern, um schneller Ergebnisse zu erhalten, bitte.

+0

Wenn Ihr Code funktioniert, ist ein besserer Ort für diese Art von Fragen [Code Review] (https://codereview.stackexchange.com/) –

Antwort

0

Nizza Frage Try This:

import time, os 

def create_files_structuredire_2(ctoryname): 

    files_list = [] 
    counter = 0 

    for dirpath, _, filenames in os.walk(ctoryname): 

     for items in filenames: 

      file_full_path = os.path.abspath(os.path.join(dirpath, items)) 
      get_size = os.path.getsize(file_full_path) 
      files_list.append((file_full_path, get_size)) 
      counter += 1 

    files_list.sort(key=lambda s: s[1], reverse=True) 
    [print(f) for f in files_list] 
    print(counter) 


start = time.time() 
create_files_structuredire_2("your_target_folder") 
end = time.time() 
print(end-start) 

HINWEIS: Ihre Zeit ist ,044736385345458984, meine Zeit ist ,001501321792602539 !!!!!!

Good Luck ...

+0

Sie filtern nicht das '.' Subdirs aus dem Scan - versuchen Sie es mit dem Timing zu vergleichen – orip

1
  1. Um ein Gefühl dafür zu bekommen, wie schnell Sie bekommen können, versuchen Sie, und das Timing du -k auf das Verzeichnis. Sie werden wahrscheinlich nicht schneller als das mit Python für eine vollständige Liste.
  2. Wenn Sie auf Python < 3.5 laufen, versuchen Sie, für eine nette Leistungsverbesserung oder scandir zu aktualisieren.
  3. Wenn Sie wirklich brauchen nicht die ganze Liste von Dateien, sondern kann zB mit den größten 1000 Dateien leben:

Vermeiden Sie die Liste zu halten und verwenden heapq.nlargest mit einem Generator

def get_sizes(root): 
    for path, dirs, files in os.walk(root): 
    dirs[:] = [d for d in dirs if not d.startswith('.')] 
    for file in files: 
     full_path = os.path.join(path, file) 
     try: 
      # keeping the size first means no need for a key function 
      # which can affect performance 
      yield (os.path.getsize(full_path), full_path) 
     except Exception: 
      pass 

import heapq 
for (size, name) in heapq.nlargest(1000, get_sizes(r"c:\some\path")): 
    print(name, size) 

EDIT - um unter Windows noch schneller zu werden - os.scandir liefert Einträge, die bereits die Größe enthalten, um einen weiteren Systemaufruf zu vermeiden.

Dies bedeutet os.scandir zu verwenden und rekursiv statt sich auf os.walk zu verlassen, die diese Information nicht liefert.

Es gibt ein ähnliches Arbeitsbeispiel get_tree_size() Funktion in der scandir PEP 471, die leicht geändert werden kann, um stattdessen Namen und Größen zu liefern. Auf die Größe jedes Eintrags kann mit entry.stat(follow_symlinks=False).st_size zugegriffen werden.