2010-04-19 60 views
7

Tôi có một danh sách các chuỗi chứa khoảng 7 triệu mục trong một tệp văn bản có kích thước 152MB. Tôi đã tự hỏi những gì có thể là cách tốt nhất để thực hiện một chức năng mà có một chuỗi duy nhất và trả về cho dù đó là trong danh sách các chuỗi.Ghép nối một chuỗi trong một tệp văn bản lớn?

Trả lời

5

Bạn sẽ phải đối sánh với tệp văn bản này nhiều lần? Nếu có, tôi sẽ tạo một HashSet<string>. Nếu không, chỉ cần đọc nó từng dòng (tôi giả sử có một chuỗi trên mỗi dòng) và xem liệu nó có khớp không.

152MB ASCII sẽ kết thúc với hơn 300MB dữ liệu Unicode trong bộ nhớ - nhưng trong các máy hiện đại có nhiều bộ nhớ, do đó, giữ toàn bộ lô trong HashSet<string> sẽ thực hiện tra cứu lặp lại rất nhanh.

Các tuyệt đối đơn giản nhất cách để làm điều này là có thể sử dụng File.ReadAllLines, mặc dù điều đó sẽ tạo ra một mảng mà sau đó sẽ bị loại bỏ - không tuyệt vời cho sử dụng bộ nhớ, nhưng có lẽ không phải là quá xấu:

HashSet<string> strings = new HashSet<string>(File.ReadAllLines("data.txt")); 
... 

if (strings.Contains(stringToCheck)) 
{ 
    ... 
} 
+0

Thực ra tôi phải tìm kiếm lặp đi lặp lại. Nhưng tôi sẽ sử dụng nó trong một ứng dụng web. Bộ nhớ sẽ trở thành một vấn đề với nhiều yêu cầu? –

+2

@Taz: Số yêu cầu không liên quan, miễn là bạn xây dựng bản băm chỉ một lần :) Theo tài liệu: * Mọi thành viên tĩnh công khai thuộc loại này là an toàn chủ đề *, vì vậy không có vấn đề gì ở đây, quá – tanascius

+0

@Taz : tanascius là đúng. Tải nó lên một lần và bạn sẽ có thể tìm kiếm (sử dụng nhiều chủ đề đồng thời, thậm chí - miễn là không có gì ghi vào nó) mà không cần sử dụng thêm bộ nhớ. Vì vậy, miễn là máy chủ web của bạn có đủ bộ nhớ để giữ các thiết lập, đó là con đường để đi. –

3

Phụ thuộc vào những gì bạn muốn làm. Khi bạn muốn lặp lại việc tìm kiếm các kết quả trùng khớp lặp đi lặp lại, tôi sẽ tải toàn bộ tệp vào bộ nhớ (vào một số HashSet). Có rất dễ dàng để tìm kiếm các trận đấu.

Các vấn đề liên quan