grep
tìm thấy các dòng phù hợp với mô hình. Vì vậy, nó phải tải một dòng tại một thời điểm trong bộ nhớ. GNU grep
trái ngược với nhiều grep
triển khai khác không có giới hạn về kích thước của các dòng nó đọc và hỗ trợ tìm kiếm trong các tệp nhị phân. Vì vậy, nếu bạn đã có một tệp có một dòng rất lớn (nghĩa là có hai ký tự dòng mới rất xa appart), lớn hơn bộ nhớ khả dụng, nó sẽ thất bại.
Điều đó thường xảy ra với một tập tin thưa thớt. Bạn có thể sao chép nó bằng:
truncate -s200G some-file
grep foo some-file
Đó là một khó khăn để làm việc xung quanh. Bạn có thể làm điều đó như (vẫn với GNU grep
):
find ~/Documents -type f -exec sh -c 'for i do
tr -s "\0" "\n" < "$i" | grep --label="$i" -He "$0"
done' Milledgeville {} +
Điều đó chuyển đổi các chuỗi ký tự NUL thành một ký tự dòng mới trước khi đưa đầu vào vào grep
. Điều đó sẽ bao gồm cho các trường hợp vấn đề là do các tệp thưa thớt.
Bạn có thể tối ưu hóa nó bằng cách chỉ thực hiện đối với các tệp lớn:
find ~/Documents -type f \( -size -100M -exec \
grep -He Milledgeville {} + -o -exec sh -c 'for i do
tr -s "\0" "\n" < "$i" | grep --label="$i" -He "$0"
done' Milledgeville {} + \)
Nếu các tệp không thưa thớt và bạn có phiên bản GNU grep
trước đó 2.6
, bạn có thể sử dụng --mmap
tùy chọn này. Các dòng sẽ được ghép vào bộ nhớ trái ngược với sao chép ở đó, điều đó có nghĩa là hệ thống luôn có thể lấy lại bộ nhớ bằng cách phân trang các trang vào tệp. Tùy chọn đó đã bị xóa trong GNU grep
2.6