2012-01-09 33 views
5

Tôi đang làm việc trên ứng dụng gốc C++/Win32/MFC trên Windows 7. Tôi đang sử dụng CFile để mở tệp được lưu trữ trên máy chủ từ xa (với các cờ, CFile :: modeRead | CFile :: shareDenyWrite). Máy chủ đang chạy Windows Server 2008 và tôi đang truy cập tệp trên ổ chia sẻ thông qua chia sẻ tệp windows thường xuyên. Khi tôi mở tệp, tôi sẽ đọc tệp như được mô tả bên dưới.hiệu suất khi truy cập tệp trên máy chủ mạng tuần tự sau khi truy cập ngẫu nhiên

Trước tiên, tôi đang tìm kiếm nhiều vị trí trong tệp (10 vị trí) và đọc các phần nhỏ (128 byte). Sau đó, tôi đang tìm cách bắt đầu và đọc tuần tự thông qua toàn bộ tập tin.

Điều tôi nhận thấy là thực hiện các bước trên là MUCH chậm hơn là chỉ mở tệp và đọc qua tệp đó. Việc tìm kiếm và lấy mẫu ngẫu nhiên ban đầu rất nhanh, gần như ngay lập tức ngay cả với một tệp lớn. Điều thú vị là mặc dù điều này là nhanh chóng, phần tiếp theo, quét qua các tập tin là rất chậm khi so sánh với chỉ quét qua nó mà không có sự truy cập ngẫu nhiên ban đầu.

Khi cố gắng tìm hiểu điều gì đang diễn ra, tôi đã kéo màn hình hiệu suất lên và xem lưu lượng mạng. Nếu tôi chỉ đọc tuần tự đọc qua tập tin, tôi sẽ tải xuống 3,5MB/s qua bộ điều hợp không dây. Nếu tôi lần đầu tiên tìm kiếm ngẫu nhiên xung quanh, sau đó tuần tự đọc qua tôi chỉ nhận được 300kB/s trong khi đọc tuần tự.

Giải pháp là đóng và mở lại tệp sau khi thực hiện phần truy cập ngẫu nhiên. Khi tôi đã làm điều này, đọc tuần tự tăng tốc ngay lập tức.

Vì vậy, có vẻ như thực hiện truy cập ngẫu nhiên lần đọc (tìm kiếm và đọc) đã làm một cái gì đó trên máy chủ mà sau đó gây ra đọc tuần tự chậm. Tôi tự hỏi, có ai biết chắc chắn những gì đang xảy ra ở đây và nguyên nhân thực sự là của hành vi tôi đang nhìn thấy? Mặc dù tôi có một sửa chữa cho nó tôi muốn hiểu rõ hơn những gì đang xảy ra dưới mui xe để gây ra điều này.

+2

Hoàn toàn suy đoán, có thể các cửa sổ đã nhận ra tệp đang được sử dụng để truy cập ngẫu nhiên và do đó đã vô hiệu hóa tải trước các trang tuần tự của tệp? Tôi nghi ngờ nó mặc dù. –

Trả lời

6

Nhận xét của Mooing Duck là đúng. Hệ điều hành bắt đầu giả định truy cập tuần tự như một tùy chọn 'mềm' - được kích hoạt cho đến khi được chứng minh là có hại. Tuy nhiên, các truy cập ngẫu nhiên làm cho việc đọc phía trước để làm cho hiệu suất tồi tệ hơn, và hành vi bộ nhớ đệm 'thông minh' biến đọc trước.

Bạn sẽ nghĩ rằng một vài truy cập tuần tự sẽ khiến Windows bật lại tính năng này. Nhưng thật không may, lá cờ không còn 'mềm' vào thời điểm này nữa. Windows xem xét truy cập ngẫu nhiên đã được chứng minh từ đó, như thể bạn đã ép nó vào chế độ đó.

Bạn có thể vượt qua CreateFile tùy chọn FILE_FLAG_SEQUENTIAL_SCAN để buộc ứng dụng tiếp tục đọc trước bất kể điều gì. Nhưng giải pháp mở lại của bạn có lẽ là về tốt như bất cứ điều gì. Và đó là cách duy nhất nếu bạn không gọi trực tiếp CreateFile.

+0

tuyệt vời! Cảm ơn! Vui mừng khi hiểu những gì đang diễn ra tốt hơn một chút. – Nerdtron

+0

+1, điều cần biết. – lapk

+1

Tôi tự hỏi nếu sử dụng cờ 'quét tuần tự' có thể làm chậm phần truy cập ngẫu nhiên. – Nerdtron

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