Python'da büyük bir dosya okurken bu yöntemlerin RAM kullanımındaki farkı anlamak isterim.Parçalar içinde dosya oku - RAM kullanımı, ikili dosyalardaki dizeleri oku
f = open(file, 'rb')
while True:
piece = f.read(1024)
process_data(piece)
f.close()
dosya her iki versiyonda da kısmen okunur: stackoverflow burada bulunan
Versiyon 1, i Yukarıdaki kod bulmadan önce
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()
Sürüm 2, i kullandı. Ve mevcut parça işlenebilir. İkinci örnekte, piece
her döngüde yeni içerik alıyor, bu yüzden bu işi belleğe tamamlanmış bir dosyaya yükleyemezsiniz diye düşündüm ..?
Ama gerçekten yield
'un ne yaptığını anlamıyorum ve eminim ki burada yanlış bir şey var. Bunu bana açıklayan var mı?
kullanılan yöntemin yanı sıra, Kafamı kurcalayan başka bir şey yoktur: Yukarıdaki örneklerde
okuduğum parçasının içeriği yığın-boyutuna göre tanımlanır, 1KB. Ama ... eğer dosyada dizeleri aramam gerekirse? "ThisIsTheStringILikeToFind"
gibi bir şey?
Dize dosyasında nerede bulunduğuna bağlı olarak, bir parça "ThisIsTheStr"
parçasını içerir - ve sonraki parça "ingILikeToFind"
içerir. Böyle bir yöntem kullanarak, bütün dizeyi herhangi bir parçada tespit etmek mümkün değildir.
Parçalar halinde bir dosyayı okumak için bir yol var - ama bir şekilde böyle dizeleri önemsiyor musunuz?
Herhangi bir yardım veya fikri açığız,
greets!
Eğer ilk parçasını yazabiliriz '("" b kısmi (f.read, parça_boyutu)) ITER olarak parça için : process_data (yığın) '(ikili modunu varsayar). Son soruya verilen cevap evet: sadece öbek dizgisinin önekleriyle bitip bitmeyeceğini ve sonraki parçanın ilgili sonekle başlayıp başlamadığını kontrol et. – jfs
"iter" i belirtdiğiniz için teşekkür ederiz - bunu bilmiyordum! İkinci soru hakkında: “T” veya “Th” veya “Thi” veya “Bu” ile biten parçanın bitip bitmediğini kontrol edebilir miyim? Hmm, iyi fikir! Teşekkürler! – xph