[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [gulliver] Re: Programme pour analyser un système de fichier ?


From Thomas de Grenier de Latour <degrenier at easyconnect dot fr>
Subject Re: [gulliver] Re: Programme pour analyser un système de fichier ?
Date Wed, 22 Mar 2006 00:35:27 +0100

On Tue, 21 Mar 2006 21:15:36 +0100,
David MENTRE <dmentre at linux-france dot org> wrote:

> Ben finalement, j'ai refait la roue. :)
> 
>  http://www.linux-france.org/~dmentre/code/filesystem-analysis.ml
> 

Merci, j'étais moi aussi curieux de voir ce genre de stats sur quelques
répertoires depuis que tu en as parlé, donc voilà, maintenant je peux.

Je te joins un petit patch qui ajoute une info sur la taille médiane
des fichiers (enfin, plus exactement qui indique l'intervale dans lequel
elle devrait se trouver). Déso si jamais c'est pas très stylé, ça
faisait un certain temps que je n'avais pas retouché de l'ocaml.
Le patch corrige aussi deux ou trois micro-bugs : une division par zéro
sur les répertoires vides, et une taille mini affichée de "max_int"
dans ce même cas de beta-testeur pervers. Et puis aussi l'affichage de
la taille nulle qui apparaissait comme "1 B".

-- 
TGL.
--- filesystem-analysis.ml.orig	2006-03-21 23:19:34.000000000 +0100
+++ filesystem-analysis.ml	2006-03-22 00:30:51.000000000 +0100
@@ -40,6 +40,19 @@
 
 (* end of copy/paste *)
 
+let rec get_median_size_range total count sorted_distrib =
+  match sorted_distrib with
+      [] -> 0
+    | [(b,c)] -> b
+    | (b,c) :: l -> 
+      if ((2 * (count + c)) >= total) then b
+      else get_median_size_range total (count + c) l
+
+let size_range bin =
+  let v = if bin <= 0 then 0
+    else int_of_float (2.0 ** (float_of_int bin)) in
+  (v, (max 0 (2*v-1)))
+
 let print_analysis stats =
   printf "Total file size: % 10Ld bytes at \n" stats.total_file_size;
   printf "Minimum non empty file size: % 10s at \n"
@@ -47,7 +60,7 @@
   printf "Maximum file size: % 10s at \n" (human_size stats.max_file_size);
   printf "Average file size: % 10s at \n" 
     (human_size (Int64.to_int (Int64.div stats.total_file_size 
-                                 (Int64.of_int stats.num_files))));
+                                 (Int64.of_int (max stats.num_files 1)))));
   printf "Total number of files: %d at \n" stats.num_files;
   printf " of which are empty files: %d at \n" stats.num_zero_files;
   printf "Total number of directories: %d at \n" stats.num_directories;
@@ -56,13 +69,19 @@
     Hashtbl.fold (fun bin count l -> (bin, count) :: l)
       stats.size_distribution [] in
   let sorted_distrib = List.sort compare distrib in
+  let bin = get_median_size_range
+    stats.num_files 0 sorted_distrib in
+  let v1,v2 = size_range bin in
+  printf "Median file size in the [%s - %s] range at \n"
+    (human_size v1)
+    (human_size v2);
   let print_line (bin, count) =
-    let v = int_of_float (2.0 ** (float_of_int bin)) in
-    printf "[% 10s - % 10s] % 7d files - total average of % 10s at \n" 
-      (human_size v) 
-      (human_size (2*v-1)) 
+    let v1,v2 = size_range bin in
+    printf "[% 10s - % 10s] % 7d files - total average of % 10s at \n"
+      (human_size v1)
+      (human_size v2)
       count
-      (human_size ((v+v/2)*count)) in
+      (human_size ((v1+v1/2)*count)) in
   printf "File size distribution:@\n";
   List.iter print_line sorted_distrib
   
@@ -128,4 +147,5 @@
     num_zero_files = 0;
     num_directories = 0; } in
   handle_unix_error (parse_dir_path stats) (Sys.argv.(1));
+  if (stats.num_files == 0) then stats.min_file_size <- 0;
   print_analysis stats