Hayır, bir dosya açılarak otomatik olarak belleğe okunmaz. Bu çok verimsiz olurdu. sed
Örneğin, birçok diğer Unix aracında olduğu gibi giriş satırını satır satır okur. Nadiren mevcut satırdan daha fazlasını bellekte tutması gerekir.
Bununla awk
aynı. Her seferinde bir kaydı okur , bu varsayılan olarak bir çizgidir. Giriş verilerinin bölümlerini değişkenlerde saklarsanız, bu elbette 1 olacaktır .
Bazı insanlar gibi şeyler yapma alışkanlığı var
for line in $(cat file); do ...; done
Kabuğun $(cat file)
, for
döngünün ilk yinelemesini bile çalıştırmadan önce komut ikamesini tamamen genişletmesi gerekeceğinden , bu işlem bütünün file
belleğini okuyacak ( for
döngüyü çalıştıran kabuk tarafından kullanılan belleğe ). Bu biraz saçma ve aynı zamanda inelegant. Bunun yerine, kişi yapmalı
while IFS= read -r line; do ...; done <file
Bu file
satır satır işleyecektir (ancak "IFS = read -r line" ı Anlamak bölümünü oku ).
Dosyaların satır satır satır işlenmesi, çoğu yardımcı program zaten satır yönelimli olduğundan, ancak nadiren ihtiyaç duyulur (bkz. Neden kötü uygulama olarak kabul edilen metni işlemek için bir kabuk döngüsü kullanıyorsunuz? ).
Biyoinformatikte çalışıyorum ve çok büyük miktarlarda genomik veri işlerken, sadece bellekte kesinlikle gerekli olan verilerin parçalarını tutmadığım sürece pek bir şey yapamayacağım. Örneğin, bir VCF dosyasındaki DNA varyantlarını içeren 1 terabaytlık bir veri kümesinden bireyleri tanımlamak için kullanılabilecek veri parçalarını çıkarmam gerektiğinde (bu tür verilerin halka açık hale getirilememesi nedeniyle) satır satır yapıyorum Basit bir awk
programla işleme (VCF formatı satır yönelimli olduğu için mümkündür). Ben yok , belleğe dosyayı okumak onu orada işlemek ve tekrar vazgeçme yazın! Dosya sıkıştırılmış olsaydı, onu beslerdim zcat
ya da verilerin akışını işleme koyduğundan gzip -d -c
beri gzip
tüm dosyayı da belleğe okumazdı.
JSON veya XML gibi satır yönelimli olmayan dosya biçimlerinde bile, büyük dosyaları hepsini RAM'de saklamaksızın işlemeyi mümkün kılan akış ayrıştırıcıları vardır.
Yürütülebilir dosyalarda, paylaşılan kitaplıklar isteğe bağlı olarak yüklenebildiğinden ve / veya işlemler arasında paylaşılabildiğinden biraz daha karmaşıktır ( örneğin, paylaşılan kitaplıkların yüklenmesi ve RAM kullanımı gibi).
Önbellekleme burada bahsetmediğim bir şey. Bu, sık erişilen veri parçalarını tutmak için RAM kullanma eylemidir. Daha küçük dosyalar (örneğin yürütülebilir dosyalar), kullanıcının kendilerine birçok referans yapması umuduyla OS tarafından önbelleğe alınabilir. Dosyanın ilk okunmasından ayrı olarak, daha sonra disk yerine RAM'e erişilir. Önbelleğe alma, giriş ve çıktının tamponlanması gibi, genellikle kullanıcı için büyük ölçüde şeffaftır ve uygulamaları önbelleğe almak için kullanılan bellek miktarı, uygulamalar vb. Tarafından tahsis edilen RAM miktarına bağlı olarak dinamik olarak değişebilir.
1 Teknik olarak, çoğu program muhtemelen açık ara belleğe kullanarak veya örtülü olarak standart G / Ç kütüphaneleri yapmak arabelleğe yoluyla ve sonra, ya bir defada girdi Veri yığınının okumak kullanıcının koduna çizgiyle yığın hattı söyledi. Diskin blok boyutunun birçoğunu okumak, her seferinde bir karakterden çok daha verimlidir. Bu yığın boyutu nadiren bir avuç kilobayttan daha büyük olacaktır.