Chciałbym zrozumieć różnicę w użyciu pamięci RAM tej metody podczas odczytu dużego pliku w pythonie.Odczytuj plik w porcjach - użycie pamięci RAM, przeczytaj ciągi znaków z plików binarnych
Wersja 1, tutaj na stackoverflow:
def read_in_chunks(file_object, chunk_size=1024):
while True:
data = file_object.read(chunk_size)
if not data:
break
yield data
f = open(file, 'rb')
for piece in read_in_chunks(f):
process_data(piece)
f.close()
Version 2, użyłem tego wcześniej znalazłem powyższy kod:
f = open(file, 'rb')
while True:
piece = f.read(1024)
process_data(piece)
f.close()
Plik jest częściowo odczytać w obu wersjach. I obecny kawałek może być przetwarzany. W drugim przykładzie, piece
uzyskuje nową zawartość w każdym cyklu, więc myślałem, że to będzie działało na nie załadować kompletny plik do pamięci ..?
Ale tak naprawdę nie rozumiem, co robi yield
i jestem prawie pewien, że coś tu jest nie tak. Czy ktoś mógłby mi to wyjaśnić?
Jest jeszcze coś, co mnie zastanawia, oprócz od zastosowanej metody:
Zawartość sztukę czytałem jest zdefiniowany przez fragmentu wielkości, 1KB w powyższych przykładach. Ale ... co jeśli potrzebuję szukać ciągów w pliku? Coś takiego jak "ThisIsTheStringILikeToFind"
?
W zależności od tego, w którym miejscu pliku występuje ciąg, może to oznaczać, że jedna część zawiera część "ThisIsTheStr"
- a następny element będzie zawierał "ingILikeToFind"
. Przy użyciu takiej metody nie można wykryć całego ciągu w jakimkolwiek utworze.
Czy istnieje sposób, aby odczytać plik w kawałkach - ale jakoś dbać o takie ciągi?
Każda pomoc lub pomysł jest mile widziany,
wita!
można napisać pierwszego fragmentu jako 'dla kawałka w ITER (częściowe (f.read, chunk_size), B„”) : process_data (chunk) '(przyjmij tryb binarny). Odpowiedź na ostatnie pytanie brzmi: tak: po prostu sprawdź, czy porcja kończy się prefiksem łańcucha, a następny fragment zaczyna się od odpowiedniego sufiksu. – jfs
Dziękuję, że wspomniałeś o 'iter' - tego nie wiedziałeś! Drugie pytanie: Masz na myśli, że mogę sprawdzić, czy utwór kończy się na 'T' lub' Th' lub 'Thi' lub' This' - i tak dalej? Hmm, fajny pomysł! Dzięki! – xph