Không, một tập tin không được tự động đọc vào bộ nhớ bằng cách mở nó. Điều đó sẽ rất kém hiệu quả. sed
, ví dụ, đọc từng dòng đầu vào của nó, cũng như nhiều công cụ Unix khác. Nó hiếm khi phải giữ nhiều hơn dòng hiện tại trong bộ nhớ.
Với awk
nó cũng vậy. Nó đọc một bản ghi tại một thời điểm, theo mặc định là một dòng. Nếu bạn lưu trữ các phần của dữ liệu đầu vào trong các biến, đó sẽ là phần phụ, tất nhiên là 1 .
Một số người có thói quen làm những việc như
for line in $(cat file); do ...; done
Vì shell sẽ phải mở rộng $(cat file)
hoàn toàn thay thế lệnh trước khi chạy ngay cả lần lặp đầu tiên của for
vòng lặp, điều này sẽ đọc toàn bộ file
vào bộ nhớ (vào bộ nhớ được sử dụng bởi shell thực thi for
vòng lặp). Điều này là một chút ngớ ngẩn và cũng không hay. Thay vào đó, người ta nên làm
while IFS= read -r line; do ...; done <file
Điều này sẽ xử lý file
từng dòng (nhưng đọc Đọc "IFS = read -r line" ).
Mặc dù vậy, việc xử lý các tệp theo từng dòng trong trình bao chỉ hiếm khi cần thiết, vì hầu hết các tiện ích đều được định hướng theo dòng (xem Tại sao sử dụng vòng lặp shell để xử lý văn bản được coi là thực tiễn xấu? ).
Tôi đang làm việc trong tin sinh học, và khi xử lý một lượng lớn dữ liệu gen, tôi sẽ không thể làm được gì trừ khi tôi chỉ giữ các bit dữ liệu thực sự cần thiết trong bộ nhớ. Ví dụ: khi tôi cần loại bỏ các bit dữ liệu có thể được sử dụng để xác định các cá nhân từ bộ dữ liệu 1 terabyte chứa các biến thể DNA trong tệp VCF (vì loại dữ liệu đó không thể được công khai), tôi thực hiện theo từng dòng xử lý với một awk
chương trình đơn giản (điều này là có thể vì định dạng VCF là định hướng theo dòng). Tôi không đọc tệp vào bộ nhớ, xử lý nó ở đó và viết lại ra! Nếu tệp được nén, tôi sẽ cung cấp cho nó thông qua zcat
hoặc gzip -d -c
, do gzip
xử lý luồng dữ liệu, cũng sẽ không đọc toàn bộ tệp vào bộ nhớ.
Ngay cả với các định dạng tệp không được định hướng theo dòng, như JSON hoặc XML, vẫn có các trình phân tích cú pháp luồng giúp xử lý các tệp lớn mà không lưu trữ tất cả trong RAM.
Với các tệp thực thi, sẽ phức tạp hơn một chút vì các thư viện dùng chung có thể được tải theo yêu cầu và / hoặc được chia sẻ giữa các quy trình ( ví dụ như Tải thư viện dùng chung và sử dụng RAM ).
Bộ nhớ đệm là thứ tôi chưa đề cập ở đây. Đây là hành động sử dụng RAM để giữ các phần dữ liệu được truy cập thường xuyên. Các tệp nhỏ hơn (ví dụ: tệp thực thi) có thể được HĐH lưu vào bộ nhớ cache với hy vọng rằng người dùng sẽ thực hiện nhiều tham chiếu đến chúng. Ngoài lần đọc tệp đầu tiên, các lần truy cập tiếp theo sẽ được thực hiện vào RAM thay vì vào đĩa. Bộ nhớ đệm, như bộ đệm của đầu vào và đầu ra thường phần lớn trong suốt đối với người dùng và dung lượng bộ nhớ được sử dụng để lưu trữ mọi thứ có thể thay đổi linh hoạt tùy thuộc vào lượng RAM được phân bổ bởi các ứng dụng, v.v.
1 Về mặt kỹ thuật, hầu hết các chương trình có thể đọc một đoạn của dữ liệu đầu vào tại một thời điểm, hoặc sử dụng đệm rõ ràng, hoặc ngầm thông qua các đệm rằng I / O thư viện tiêu chuẩn làm, và sau đó hiện dòng đoạn bởi dòng mã của người dùng. Việc đọc nhiều kích thước khối của đĩa sẽ hiệu quả hơn nhiều so với một ký tự tại một thời điểm. Kích thước chunk này sẽ hiếm khi lớn hơn một số kilobyte.