dict.clear()
jest najprostszym i powinien być ważny, ale nie wydaje się rzeczywiście skasować pliki półki (Python 3.5.2, Windows 7 64-bit). Na przykład, rozmiar pliku półka .dat
rośnie za każdym razem uruchomić poniższy fragment, a chciałbym oczekiwać, że zawsze mają ten sam rozmiar:
shelf = shelve.open('shelf')
shelf.clear()
shelf['0'] = list(range(10000))
shelf.close()
Aktualizacja:dbm.dumb
, który shelve
wykorzystuje jako swój bazodanowym pod Windows, zawiera ten element TODO in its code:
- odebrania wolnego miejsca (obecnie przestrzeń zajmowana raz przez usunięte lub rozwinięte elementy nigdy nie jest ponownie używane)
Wyjaśnia to stale rosnący problem z plikiem półek.
Więc zamiast dict.clear()
używam shelve.open
z flag='n'
. Cytowanie shelve.open()
documentation:
Opcjonalny parametr flagi ma taką samą interpretację jako flagi parametru dbm.open().
I dbm.open()
documentation dla flag='n'
:
Zawsze utworzyć nową, pustą bazę danych, otwarty do odczytu i zapisu
Jeśli półka jest już otwarty, użycie byłoby:
shelf.close()
shelf = shelve.open('shelf', flag='n')
Dlaczego po prostu nie usunąć pliku? –
Zauważ, że 'dict = {" foo ":" bar "}' powinno być 'dict [" foo "] =" bar "'. Tak jak obecnie, nie wstawia danych do obiektu półki - zamiast tego wskazuje "dict" na nowy obiekt słownika, pozostawiając niezmienioną półkę. – george