Tidak, file tidak secara otomatis dibaca ke dalam memori dengan membukanya. Itu akan sangat tidak efisien. sed
, misalnya, membaca inputnya baris demi baris, seperti halnya banyak alat Unix lainnya. Jarang harus menyimpan lebih dari garis saat ini dalam memori.
Dengan awk
itu sama. Itu membaca catatan pada suatu waktu, yang secara default adalah garis. Jika Anda menyimpan bagian dari data input dalam variabel, itu akan menjadi ekstra, tentu saja 1 .
Beberapa orang memiliki kebiasaan melakukan hal-hal seperti
for line in $(cat file); do ...; done
Karena shell harus memperluas $(cat file)
substitusi perintah sepenuhnya sebelum menjalankan bahkan iterasi pertama for
loop, ini akan membaca keseluruhan dari file
ke dalam memori (ke dalam memori yang digunakan oleh shell yang mengeksekusi for
loop). Ini agak konyol dan juga tidak bagus. Sebaliknya, yang harus dilakukan
while IFS= read -r line; do ...; done <file
Ini akan memproses file
baris per baris (tetapi baca Memahami "IFS = baca -r baris" ).
Memproses file baris per baris dalam shell jarang diperlukan, karena sebagian besar utilitas berorientasi pada baris (lihat Mengapa menggunakan shell loop untuk memproses teks yang dianggap praktik buruk? ).
Saya bekerja di bioinformatika, dan ketika memproses sejumlah besar data genom, saya tidak akan bisa berbuat banyak kecuali saya hanya menyimpan bit data yang benar-benar diperlukan dalam memori. Sebagai contoh, ketika saya perlu menghapus bit data yang dapat digunakan untuk mengidentifikasi individu dari set data 1 terabyte yang berisi varian DNA dalam file VCF (karena tipe data itu tidak dapat dipublikasikan), saya melakukan baris per baris memproses dengan awk
program sederhana (ini dimungkinkan karena format VCF berorientasi garis). Saya tidak membaca file ke dalam memori, memprosesnya di sana, dan menulisnya kembali! Jika file itu dikompresi, saya akan memberinya makan melalui zcat
atau gzip -d -c
, yang, sejak gzip
melakukan pemrosesan data, juga tidak akan membaca seluruh file ke dalam memori.
Bahkan dengan format file yang tidak berorientasi garis, seperti JSON atau XML, ada stream parser yang memungkinkan untuk memproses file besar tanpa menyimpan semuanya dalam RAM.
Dengan executable, ini sedikit lebih rumit karena perpustakaan bersama mungkin dimuat berdasarkan permintaan, dan / atau dibagi antara proses (lihat Memuat perpustakaan bersama dan penggunaan RAM , misalnya).
Caching adalah sesuatu yang belum saya sebutkan di sini. Ini adalah tindakan menggunakan RAM untuk menyimpan data yang sering diakses. File yang lebih kecil (misalnya file yang dapat dieksekusi) dapat di-cache oleh OS dengan harapan bahwa pengguna akan membuat banyak referensi. Terlepas dari pembacaan pertama file, akses selanjutnya akan dilakukan ke RAM daripada ke disk. Caching, seperti buffering input dan output biasanya sebagian besar transparan kepada pengguna dan jumlah memori yang digunakan untuk melakukan cache hal-hal dapat berubah secara dinamis tergantung pada jumlah RAM yang dialokasikan oleh aplikasi dll.
1 Secara teknis, sebagian besar program mungkin membaca sepotong input data sekaligus, baik menggunakan buffering eksplisit, atau secara implisit melalui buffering yang dilakukan perpustakaan I / O standar, dan kemudian menyajikan potongan itu baris demi baris ke kode pengguna. Jauh lebih efisien untuk membaca kelipatan ukuran blok disk daripada misalnya karakter pada satu waktu. Ukuran chunk ini jarang akan lebih besar dari beberapa kilobyte.