2013-07-11 10 views
5

Mam tę funkcję, którą chcę odczytać pojedynczy bajt z dużego pliku. Jedynym problemem jest to, że po pewnej ilości odczytanych plików, pamięć komputera podnosi się ze stałej wartości od 1,5 g na 4 gb i więcej w zależności od liczby odczytów plików. (Rozbijam na 80 plikach, ponieważ wyższy powodowałby awarię mojego komputera)Odczytaj jeden bajt z dużego pliku

Wszystko, czego chcę, to uzyskać 1 bajt, a nie cały plik. Prosimy o pomoc.

def mem_test(): 
     count = 0 
     for dirpath, dnames, fnames in scandir.walk(restorePaths[0]): 
      for f in fnames: 
       if 'DIR.EDB' in f or 'PRIV.EDB' in f: 
        f = open(os.path.join(dirpath, f), 'rb') 
        f.read(1) #Problem line! 
        f.close() 
        if count > 80: 
         print 'EXIT' 
         sys.exit(1)      
        count += 1 
mem_test() 
+2

Więc co się dzieje na linii '' #Problem? Błąd? ... czy potrzebujesz wartości zwrotu? – Ryan

+0

Czy dzieje się tak, nawet jeśli nie czytasz? Nie otwierać? Nie powtarzaj nad 'fnames'? –

+0

@JasonGray: Czy Twój problem nadal występuje, gdy zmieniasz ręczne otwieranie/zamykanie na instrukcję 'with', jak wspomniano w [dokumentacji] (http://docs.python.org/2/tutorial/inputoutput.html#methods- obiektów-plików)? W ten sposób jest bezpieczniej: 'with open (os.path.join (dirpath, f), 'rb') jako f: f.read (1)'. Może nie zamkniesz tych plików, niezależnie od tego, co tu widzimy? – Tadeck

Odpowiedz

-1

Aby rozwiązać problem pamięci, myślę, że chcesz użyć generatora!

def mem_test(): 
    for dirpath, dnames, fnames in scandir.walk(restorePaths[0]): 
     for f in fnames: 
      if 'DIR.EDB' in f or 'PRIV.EDB' in f: 
       with open(os.path.join(dirpath, f), 'rb') as f: 
        yield f.read(1) #Problem line! 

results = [x for x in mem_test()] 
+0

@downvoters: czemu nie? – Brian

+0

Nie głosowałem w dół, ale próbowałem tego i miało to ten sam efekt. przepraszam –

+0

To powinno w rzeczywistości używać * więcej * pamięci niż przykładowy kod pytającego, ponieważ próbka nie zapisuje w ogóle wartości zwracanej 'f.read'. – user2357112

Powiązane problemy