Genellikle iki tamponlama seviyesi vardır:
- Dahili arabellekler
- İşletim sistemi arabellekleri
Dahili arabellekler, programladığınız çalışma zamanı / kütüphane / dil tarafından oluşturulan arabelleklerdir ve her yazma için sistem çağrılarından kaçınarak işleri hızlandırmayı amaçlamaktadır. Bunun yerine, bir dosya nesnesine yazdığınızda, arabelleğine yazarsınız ve arabellek her dolduğunda veriler sistem çağrıları kullanılarak gerçek dosyaya yazılır.
Ancak, işletim sistemi arabellekleri nedeniyle bu, verilerin diske yazıldığı anlamına gelmeyebilir . Bu sadece verilerin çalışma süreniz tarafından tutulan arabelleklerden işletim sistemi tarafından tutulan arabelleklere kopyalandığı anlamına gelebilir.
Bir şey yazarsanız ve arabellekte sona ererse (yalnızca) ve makinenize güç kesilirse, makine kapatıldığında bu veriler diskte değildir.
Böylece, size yardımcı olmak için ilgili nesneler üzerinde flush
ve fsync
yöntemlerine sahipsiniz .
Birincisi, flush
bir program arabelleğinde kalan verileri gerçek dosyaya yazacaktır. Genellikle bu, verilerin program arabelleğinden işletim sistemi arabelleğine kopyalanacağı anlamına gelir.
Özellikle bunun anlamı, başka bir işlem aynı dosyayı okumak için açıksa, dosyaya yeni temizlediğiniz verilere erişebilmesidir. Ancak, diskte "kalıcı olarak" depolandığı anlamına gelmez.
Bunu yapmak için, os.fsync
tüm işletim sistemi arabelleklerinin bulundukları depolama aygıtlarıyla senkronize edilmesini sağlayan yöntemi çağırmanız gerekir , başka bir deyişle, bu yöntem işletim sistemi arabelleklerinden diske veri kopyalar.
Genellikle her iki yöntemle de uğraşmanıza gerek yoktur, ancak diskte gerçekten neyin bittiği hakkında paranoyaların iyi olduğu bir senaryodaysanız, her iki çağrıyı da belirtildiği gibi yapmanız gerekir.
2018'de Zeyilname.
Önbellek mekanizmalarına sahip disklerin artık 2013'te olduğundan çok daha yaygın olduğuna dikkat edin, bu yüzden artık daha fazla önbellek ve arabellek seviyesi var. Ben varsayalım bu tamponlar ve senkronizasyon / floş çağrılarıyla ele alınacaktır, ama gerçekten bilmiyorum.
with file('blah') as fd: #dostuff
, dosya tanımlayıcısının kapatılmasını garanti ettiğini biliyorum. Aynı zamanda temizler veya senkronize eder mi?