Tùy thuộc vào ho w nhiều lần bạn muốn làm 'tìm kiếm', bạn muốn sử dụng một công cụ tìm kiếm hay không. Nếu bạn muốn tìm kiếm nhiều lần, hãy sử dụng công cụ tìm kiếm, nếu không: không. Tôi sẽ mô tả cách triển khai cả hai kịch bản ở đây.
Khi sử dụng công cụ tìm kiếm: Có vẻ như bạn đang tìm kiếm các bản chất, có nghĩa là bạn nên lập chỉ mục các tệp của mình bằng cách sử dụng công cụ tìm kiếm ưa thích của mình, tốt nhất là bạn có thể tùy chỉnh (lucene, terrier, v.v.). Kỹ thuật bạn cần ở đây là lập chỉ mục trigram, nghĩa là: tất cả các kết hợp 3 ký tự phải được lập chỉ mục. F.ex .: 'foobar' sẽ tạo ra 'foo', 'oob', 'oba' và 'bar'. Khi tìm kiếm, bạn muốn thực hiện tương tự với truy vấn của mình và đưa ra một truy vấn công cụ tìm kiếm với AND của tất cả các trigram này. (Điều đó sẽ chạy một hợp nhất tham gia vào danh sách gửi bài từ các tài liệu, mà sẽ trả lại ID của họ hoặc bất cứ điều gì bạn đưa vào danh sách gửi bài).
Hoặc, bạn có thể triển khai các mảng hậu tố và lập chỉ mục các tệp của mình một lần. Điều này sẽ cung cấp cho một chút linh hoạt hơn nếu bạn muốn tìm kiếm ngắn (1-2 char) chất nền, nhưng về mặt chỉ số là khó khăn hơn để duy trì. (Có một số nghiên cứu tại CWI/Amsterdam cho mảng hậu tố lập chỉ mục nhanh)
Khi bạn muốn tìm kiếm chỉ một vài lần, thuật toán sử dụng là Boyer-Moore (tôi thường sử dụng Boyer-moore-sunday như mô tả trong [Graham A. Stephen, String Search]) hoặc DFA được biên soạn (bạn có thể xây dựng chúng từ một NFA, dễ dàng hơn để tạo). Tuy nhiên, điều đó sẽ chỉ cung cấp cho bạn một tốc độ tăng nhỏ, vì lý do đơn giản là đĩa IO có lẽ là nút cổ chai của bạn và so sánh một loạt các byte mà bạn cần giải mã anyways là khá nhanh.
Cải tiến lớn nhất bạn có thể thực hiện là không đọc từng dòng tệp của bạn, nhưng theo khối. Bạn nên định cấu hình NTFS để sử dụng kích thước khối 64 KB nếu bạn có thể đọc các tệp với số lượng 64 KB - suy nghĩ 4 MB trở lên trong một lần đọc. Tôi thậm chí còn đề nghị sử dụng IO không đồng bộ để bạn có thể đọc và xử lý (đọc dữ liệu trước đó) cùng một lúc. Nếu bạn làm điều đó một cách chính xác, điều đó đã cung cấp cho bạn việc triển khai phân chia thứ hai cho 10 MB trên phần cứng hiện đại nhất.
Cuối cùng nhưng không kém phần quan trọng, một mẹo nhỏ gọn được sử dụng trong suốt quá trình truy xuất thông tin cũng là để nén dữ liệu của bạn bằng thuật toán nén nhanh. Kể từ khi đĩa IO là chậm hơn so với bộ nhớ/CPU hoạt động, điều này có lẽ sẽ giúp đỡ là tốt. Máy nén Snappy của Google là một ví dụ điển hình về thuật toán nén nhanh.
Sự chậm lại của bạn có thể xuất phát từ việc đọc từng dòng tệp. Đọc một tập tin cùng một lúc vào bộ nhớ và tìm kiếm. – dda
http://stackoverflow.com/questions/4289353/fastest-way-to-search-ascii-files-in-c-sharp-for-simple-keywords – Ofiris
Bạn có cần thực hiện tìm kiếm trên cùng một tệp nhiều lần không? – user626528