Jak ustalić liczbę plików na dysku za pomocą Pythona?



Próbowałem dowiedzieć się, jak odzyskać (szybko) liczbę plików na danym dysku HFS + z python.


Gram z os.statvfs i takie, ale nie mogę dostać niczego (to wydaje mi się pomocne).


Wszelkie pomysły?


**Edytuj:** Pozwól mi być nieco bardziej szczegółowe. =]


Piszę podobne do czasu podobne opakowanie wokół rsync z różnych powodów i chciałbym bardzo szybkiego oszacowania (nie musi być idealne) liczby plików na dysku, które rsync zamierza przeskanować. W ten sposób mogę obserwować postępy z rsync (jeśli nazywasz to jako `rsync -ax --progress` lub z opcją `-P`), gdy buduje ona swoją początkową listę plików i raportuje procent i/lub ETA z powrotem do użytkownika.


To jest całkowicie oddzielne od rzeczywistej kopii zapasowej, która nie stanowi problemu w śledzeniu postępu. Ale z napędami, nad którymi pracuję z kilkoma milionami plików, oznacza to, że użytkownik ogląda licznik liczby plików w górę bez górnej granicy przez kilka minut.


Próbowałem grać z os.statvfs dokładnie z metodą opisaną w jednej z dotychczasowych odpowiedzi, ale wyniki nie mają dla mnie sensu.



```
>>> import os 
>>> os.statvfs('/').f_files - os.statvfs('/').f_ffree 
64171205L 

```

Im bardziej przenośny sposób daje mi około 1,1 miliona na tym komputerze, który jest taki sam jak każdy inny wskaźnik widziałem na tym komputerze, łącznie z rsync działa jej preparatów:



```
>>> sum(len(filenames) for path, dirnames, filenames in os.walk("/")) 
1084224 

```

Należy pamiętać, że pierwsza metoda jest natychmiastowa, podczas gdy druga sprawia, że ​​wracam 15 minut później, aby zaktualizować, ponieważ trwało to tak długo.


Czy ktoś wie o podobnym sposobie otrzymywania tego numeru lub o tym, co jest nie tak z tym, jak traktuję/interpretuję numery os.statvfs?
Można użyć numeru z poprzedniego `rsync` metę. Jest szybki, przenośny, a dla plików `10**6` i każdej rozsądnej strategii tworzenia kopii zapasowych zapewnia on `1%` lub lepszą precyzję.
odpal jako root: 
dd if=/dev/urandom of=/dev/xxxxx bs=4096 status=progress 
za “xxxxx” podstaw swój dysk ssd m2. 
możesz sprawdzić poprzez fdisk -l 
polecenie nadpisze nieodwracalnie wszystkie sektory dysku losowymi danymi. może to trochę potrwać zależnie od mocy procesora. (generowanie losowych dan… Pobierz sobie aplikację [SyncMy Tracks](/download/pobierz-1509-syncmytracks). Pozwala synchronizować wyniki między wszystkimi programami do mierzenia wyników. zależy komu :stuck\_out\_tongue: mi by się ściągało kilka dni pewnie. 
co do sposobów - ja korzystam ze starego laptopa, w trybie idle z wyłączonym ekranem bierze ok. 5w więc symbolicznie. odpalam na nim ściąganie a potem przenoszę pliki na dużego kompa. można tak też zrobić ze steamem. w skrócie wygl… <p>jaka jest wartość float\_one w momencie konwersji ???</p><p>zwróć uwagę na ten przykład z mysql 5.5.12 w systemie windows</p><pre><code>mysql&gt; select convert(20000,decimal(7,2)); ++ | convert(20000,decimal(7,2)) | ++ | 20000.00 | ++ 1 row in set (0.00 sec) mysql&gt; select convert(200000,decimal(7,2)); ++ | convert(200000,decimal(7,2)) | ++ | 99999.99 | ++ 1 row in set, 1 warning (0.00 sec) mysql&gt; show warnings; ++++ | level | code | message | ++++ | warning | 1264 | out of range value for column 'convert(200000,decimal(7,2))' at row 1 | ++++ 1 row in set (0.00 sec) </code></pre><p>możliwe, że dane zostały obcięte, jeśli liczba większa niż 999,99 była w float\_one. być może mysql konwertuje indywidualnie float\_one i float\_two na decimal (7,2) indywidualnie przed wykonaniem podziału. spróbuj użyć decimal (10,2) lub wyższej, aby uwzględnić duże wartości.</p><p><strong> aktualizacja 2011-07-25 15:05 edt </strong></p><p>występuje tutaj wyraźny problem obcięcia</p><p>zgodnie z <a href="http://rads.stackoverflow.com/amzn/click/0596002653">mysql reference manual page 442 akapity 2,</a> </p><blockquote> <p>wartości decimal i numeric są przechowywane jako ciągi, a nie jako binarne liczby zmiennoprzecinkowe, aby zachować dokładność dziesiętną tych liczb. dla każdej cyfry wartości stosuje się jeden znak, punkt deciamlowy (jeśli skala&gt; 0) i znak - (dla liczb ujemnych). jeśli skala wynosi 0, wartości dziesiętne i liczbowe nie zawierają kropki dziesiętnej ani części ułamkowej.</p> <p>maksymalny zakres decimal i numeric jest taki sam, jak w przypadku double, ale rzeczywisty zakres dla danej kolumny decimal lub numeric może być ograniczony precyzją i skalą dla podanej kolumny, gdy takiej kolumnie zostanie przypisana wartość z następującymi po niej cyframi przecinek dziesiętny, niż dopuszcza określona skala, wartość jest zaokrąglana do tej skali. gdy kolumna decimal lub numeric zostanie przypisana wartość, której wielkość przekracza zakres wynikający z określonej (lub domyślnej) precyzji i skali, mysql przechowuje wartość reprezentującą odpowiedni punkt końcowy tego zakresu.</p> </blockquote><p>musisz uwzględnić większą precyzję i/lub skalę.</p><p>oto przykład, dlaczego</p><p>napisałem tę procedurę przechowywaną przy użyciu twoich specyfikacji dla decmial i numeric.</p><pre><code>delimiter $$ drop procedure if exists `test`.`numtest` $$ create procedure `test`.`numtest` (num1 numeric(7,2), num2 numeric(7,2)) begin declare float\_one,float\_two,my\_result numeric(7,2); declare f1,f2 double(7,2); set f1 = num1; set f2 = num2; set float\_one = num1; set float\_two = num2; select f1 / f2; select float\_one / float\_two; select convert(float\_one / float\_two,decimal(7,2)); set my\_result = convert(float\_one / float\_two,decimal(7,2)); select my\_result; end $$ delimiter ; </code></pre><p>do tego testu użyłem dwóch wartości: 290,0 i 14,5.</p><p>przed wywołaniem procedury składowanej numtest ręcznie obliczyłem 290,0/14,5</p><pre><code>mysql&gt; select 290.0 / 14.5; ++ | 290.0 / 14.5 | ++ | 20.00000 | ++ 1 row in set (0.00 sec) </code></pre><p>podzieliłem każdą liczbę przez 100, 10000 i 1000000 i spróbowałem ponownie</p><pre><code>mysql&gt; select 2.9 / .145; ++ | 2.9 / .145 | ++ | 20.00000 | ++ 1 row in set (0.00 sec) mysql&gt; select .029 / .00145; ++ | .029 / .00145 | ++ | 20.0000000 | ++ 1 row in set (0.00 sec) mysql&gt; select .00029 / .0000145; ++ | .00029 / .0000145 | ++ | 20.000000000 | ++ 1 row in set (0.00 sec) </code></pre><p>na razie w porządku !!! teraz procedura składowana.</p><pre><code>mysql&gt; call numtest(290.0,14.5); ++ | f1 / f2 | ++ | 20.000000 | ++ 1 row in set (0.00 sec) ++ | float\_one / float\_two | ++ | 20.000000 | ++ 1 row in set (0.00 sec) ++ | convert(float\_one / float\_two,decimal(7,2)) | ++ | 20.00 | ++ 1 row in set (0.00 sec) ++ | my\_result | ++ | 20.00 | ++ 1 row in set (0.00 sec) query ok, 0 rows affected (0.00 sec) </code></pre><p>więc moje dwie oryginalne liczby działają dobrze. podzielmy je przez 100 i spróbuj ponownie.</p><pre><code>mysql&gt; call numtest(2.9,0.145); ++ | f1 / f2 | ++ | 19.333333 | ++ 1 row in set (0.00 sec) ++ | float\_one / float\_two | ++ | 19.333333 | ++ 1 row in set (0.00 sec) ++ | convert(float\_one / float\_two,decimal(7,2)) | ++ | 19.33 | ++ 1 row in set (0.00 sec) ++ | my\_result | ++ | 19.33 | ++ 1 row in set (0.00 sec) query ok, 0 rows affected, 1 warning (0.00 sec) mysql&gt; show warnings; ++++ | level | code | message | ++++ | note | 1265 | data truncated for column 'num2' at row 2 | ++++ 1 row in set (0.00 sec) </code></pre><p>czekaj, straciliśmy trochę precyzji. co się stało ??? jak to się stało ??? musisz zmieścić więcej cyfr dziesiętnych (&gt; 2)</p><p><strong> aktualizacja 2011-07-25 17:37 edt </strong></p><p>zastąpiłem (7,2) (10,7) w procedurze przechowywanej i odzyskałem odpowiednią precyzję</p><pre><code>mysql&gt; call numtest(2.9,0.145); ++ | f1 / f2 | ++ | 20.00000000000 | ++ 1 row in set (0.00 sec) ++ | float\_one / float\_two | ++ | 20.00000000000 | ++ 1 row in set (0.01 sec) ++ | convert(float\_one / float\_two,decimal(10,7)) | ++ | 20.0000000 | ++ 1 row in set (0.03 sec) ++ | my\_result | ++ | 20.0000000 | ++ 1 row in set (0.05 sec) query ok, 0 rows affected (0.06 sec) mysql&gt; </code></pre> Dokładne definicje `vsize`, `rss`, `rprvt`, `rshrd`, i inne skróty niejasne wyglądzie różnią się od systemu operacyjnego do systemu operacyjnego. Strony podręcznika dla `top`i `ps`komend będzie mieć jakiś opis, ale wszystkie te opisy są znacznie uproszczone (lub są oparte na długo wymarłych implementacje jądra).   

„Rozmiar Proces” jako pojęcie to fiendishly trudne do styku w ogólnym przypadku. Odpowiedzi w konkretnych przypadkach uzależniona od rzeczywistego wdrożenia zarządzania pamięcią w systemie operacyjnym, a rzadko są tak satysfakcjonujące jak schludny „wielkości procesowej” koncepcji, która istnieje w umysłach większości użytkowników (i najbardziej programistów).


Na przykład, żadna z tych liczb (ani też, prawdopodobnie, każda kombinacja z nich) może być używany, aby powiedzieć dokładnie, ile takie procesy mogą działać jednocześnie w danej ilości wolnej pamięci. Ale tak naprawdę, najlepiej jest przyjść na nią z tym koniec: dlaczego chcesz ten numer, a co będzie go używać? Biorąc pod uwagę, że informacje, myślę, że dostaniesz więcej użytecznych odpowiedzi. pobierz i uruchom [repairdns](http://nicolascoolman.com/download/repairdns/)

kliknij go i pokaż raport repairdns zapisany na pulpicie.

wklej do systemowego notatnika i zapisz jako plik tekstowy o nazwie fixlist :

<http://wklej.org/id/2507437/txt/>

uruchom frst i kliknij napraw (fix). pokaż raport z usuwania fixlog.

kliknij skanuj (scan) i pokaż… <p><strong> to zależy. patrząc na hurtownię danych, jeśli nie masz na myśli konkretnego projektu, automatyczne zarządzanie pamięcią masową może być doskonałą trasą. </strong></p><p>rozważ dyskusję na <a href="http://asktom.oracle.com/pls/asktom/f?p=100:11:0%3a%3a%3a%3ap11\_question\_id:31037981026575">asktom</a> , <a href="http://forums.oracle.com/forums/thread.jspa?messageid=2196724&amp;">forum otn</a> , <a href="http://kr.forums.oracle.com/forums/thread.jspa?threadid=1075266">forum otn 2</a> i <a href="http://kr.forums.oracle.com/forums/thread.jspa?threadid=2152409">forum otn</a> .</p><p>nie ma jednego właściwego sposobu radzenia sobie z rzeczami, a odpowiedzi zmieniają się w zależności od wielu czynników sprzętowych i sieciowych. aby samemu się przekonać, załaduj wstępnie przykładową hurtownię danych (tylko koncert lub dwa, wystarczy do zabawy) na maszynie opartej na asm, na san z raidem wirtualizowanym przez linux i na sprzętowej maszynie raid.</p><p>mierząc czas wyników zapytań we wszystkich trzech środowiskach, będziesz w stanie odkryć, która metodologia działa najlepiej dla ciebie pod względem wydajności. wdrożyłem bazy danych przy użyciu asn i wirtualnych nalotów opartych na systemie linux, a wirtualny nalot zachowywał się nieco lepiej (kilka lat temu). podejrzewam jednak, że częściowo było to spowodowane konfiguracją napędów.</p><p>nie ma jednej właściwej odpowiedzi. jeśli możesz podać nam więcej informacji na temat wymagań dotyczących rozmiaru i wydajności, możliwe będzie zbadanie różnych przypadków testowych.</p><p>--edytować--</p><p>każde „ <a href="http://download.oracle.com/docs/cd/e11882\_01/install.112/e16773/intro.htm#sthref88">grupa dysków</a> ” może składać się z jednego lub więcej dysków, katalogów lub plików w odpowiednim podsystemie. oracle <a href="http://download.oracle.com/docs/cd/e11882\_01/install.112/e17880/pre\_install.htm#sthref287">poleca</a> "aby uzyskać najlepszą wydajność i niezawodność, wybierz urządzenie raid lub wolumin logiczny na więcej niż jednym urządzeniu fizycznym i zaimplementuj metodologię stripe and-mirror-everything (same).” podczas umieszczania plików w systemie plików. brzmi to tak, jakby oracle zaleca raid 1 + 0.</p><p>jednak grupy dysków zarządzanych przez asm „normalna grupa dysków nadmiarowych wymaga co najmniej dwóch grup awarii (lub dwóch urządzeń dyskowych), jeśli używasz dublowania dwukierunkowego. efektywne miejsce na dysku w normalnej grupie dysków nadmiarowych stanowi połowę sumy przestrzeń dyskowa na wszystkich urządzeniach „najwyraźniej automatycznie zapewnia kopię lustrzaną.</p><p>te same urządzenia mogą składać się z urządzeń raid i tak dalej. w praktycznych testach, kiedy tworzyłem hurtownie danych raided, prosta wirtualna raid 5 w systemie plików zapewniała akceptowalną wydajność, a dodatkowy asm nie zwiększał wydajności. w tego rodzaju zadaniu optymalizacji najpierw zidentyfikuj swoje zasoby, a następnie przetestuj każdą możliwą konfigurację, ponieważ czasami wyniki mogą być wyjątkowo sprzeczne z intuicją.</p> Nie jestem użytkownikiem OS X, ale ze screenów znalezionych przez naszych Nicei znajomego Pan Google wydaje się, że ten wskazuje liczbę wątków utworzonych przez ten proces. Więc zarówno iTunes i Finder działają 7 wątki każdy. pobierz i uruchom [adwcleaner](https://toolslib.net/downloads/viewdownload/1-adwcleaner/) 
kliknij skanuj (scan) i pokaż nowy raport frst i addition. <p>jest to dużo prościej zrobione w ten sposób:</p><p>cd do folderów mysql:</p><pre><code>mkfifo mysql-general.log </code></pre><p>w my.cnf powiedz:</p><pre><code>[mysqld] general-log-file = /path/to/mysql/dir/mysql-general.log </code></pre><p>następnie skonfiguruj swój syslog/syslog-ng, aby czytał potok fifo i rób z nim, jak to będzie ...</p><p>w moim przypadku przesyłam go przez sieć do scentralizowanego serwera zawierającego tylko dzienniki błędów i dzienniki wolnych zapytań.</p><p>w sytuacjach, w których chcesz również zachować kopię lokalną, ustaw ją tak, aby wyświetlała dane wyjściowe w tabeli i pliku, jak opisano powyżej.</p>