2008-09-26 28 views
9

Tôi gặp sự cố yêu cầu tôi phân tích cú pháp nhiều tệp nhật ký từ máy từ xa. Có một vài biến chứng: 1) Các tập tin có thể được sử dụng 2) Các tập tin có thể khá lớn (100MB +) 3) Mỗi ​​mục có thể đa dòngCách tốt nhất để đọc và phân tích cú pháp tệp văn bản lớn qua mạng là gì?

Để giải quyết vấn đề trong sử dụng, Tôi cần phải sao chép nó trước. Tôi hiện đang sao chép trực tiếp từ máy từ xa sang máy cục bộ và phân tích nó ở đó. Điều đó dẫn đến vấn đề 2. Vì các tập tin sao chép khá lớn nên nó có thể mất khá nhiều thời gian.

Để tăng thời gian phân tích cú pháp, tôi muốn làm cho trình phân tích cú pháp đa luồng, nhưng điều đó làm cho việc xử lý các mục nhiều hàng một chút phức tạp hơn.

Hai vấn đề chính là: 1) Làm cách nào để tăng tốc độ truyền tệp (Nén ?, Chuyển cục bộ ngay cả cần thiết ?, Tôi có thể đọc tệp đang sử dụng theo cách khác không?) 2) Làm thế nào để tôi đối phó với các mục nhiều dòng khi chia nhỏ các dòng giữa các luồng?

CẬP NHẬT: Lý do tôi không thực hiện phân tích cú pháp rõ ràng trên lý do máy chủ là tôi muốn có ít tác động nhất đến cpu nhất có thể. Tôi không muốn ảnh hưởng đến hiệu suất của hệ thống kiểm tra im.

Trả lời

2

Nếu bạn đang đọc một tệp tuần tự bạn muốn đọc nó theo từng dòng trên mạng. Bạn cần một phương thức truyền có khả năng truyền trực tuyến. Bạn sẽ cần phải xem xét công nghệ phát trực tiếp IO của bạn để tìm ra điều này.

Các hoạt động IO lớn như thế này sẽ không được hưởng lợi nhiều bởi đa luồng vì bạn có thể xử lý các mục nhanh như bạn có thể đọc chúng qua mạng.

Tùy chọn tuyệt vời khác của bạn là đặt trình phân tích nhật ký trên máy chủ và tải xuống kết quả.

+0

Nếu sao chép tệp văn bản 100MB trực tiếp qua mạng mất x giây và có ứng dụng khách từ xa nén và gửi tệp và sau đó giảm phát/đọc mất x/4 giây, điều đó không đáng giá? (Lưu ý, tôi không thực sự biết phải mất bao lâu để nén/gửi/giải nén/đọc) – midas06

+0

Bởi tất cả các phương tiện bạn có thể (và nên) sử dụng một số nén qua mạng. Như tôi đã nói, hãy xem xét các tùy chọn phát trực tuyến IO của bạn - một số người đã đề xuất một số thư viện zip. OTOH nếu bạn có thể đặt chương trình ở đầu từ xa, hãy xử lý ở đó! –

1

Cách dễ nhất xem xét bạn đã sao chép tệp sẽ là nén tệp trước khi sao chép và giải nén sau khi sao chép hoàn tất. Bạn sẽ nhận được rất nhiều lợi ích khi nén các tập tin văn bản vì thuật toán zip thường hoạt động rất tốt trên chúng. Ngoài ra logic phân tích cú pháp hiện tại của bạn có thể được giữ nguyên vẹn hơn là phải nối nó với một trình đọc văn bản mạng từ xa.

Điểm bất lợi của phương pháp này là bạn sẽ không thể nhận được các bản cập nhật theo từng dòng một cách hiệu quả, đó là điều tốt để có cho trình phân tích cú pháp nhật ký.

+0

Tôi rất thích nén nó, nhưng nếu mã của tôi đang chạy trên máy cục bộ, nó sẽ bị nén sau khi được chuyển, điều này sẽ đánh bại mục đích. Tôi nghĩ rằng cuối cùng bị bệnh phải viết một clienttthat không có gì nhưng nén và gửi. – midas06

0

Tôi đã sử dụng SharpZipLib để nén các tệp lớn trước khi chuyển chúng qua Internet. Vì vậy, đó là một lựa chọn.

Một ý tưởng khác cho 1) sẽ là tạo một assembly chạy trên máy từ xa và thực hiện phân tích cú pháp ở đó. Bạn có thể truy cập vào assembly từ máy cục bộ bằng cách sử dụng .NET remoting. Việc lắp ráp từ xa sẽ cần phải là một dịch vụ Windows hoặc được lưu trữ trong IIS. Điều đó sẽ cho phép bạn giữ các bản sao của các tệp nhật ký trên cùng một máy và theo lý thuyết nó sẽ mất ít thời gian hơn để xử lý chúng.

0

tôi nghĩ rằng việc sử dụng tính năng nén (deflate/gzip) sẽ giúp

1

Tôi đoán nó phụ thuộc vào cách "từ xa". 100MB trên mạng LAN 100Mb sẽ mất khoảng 8 giây ... lên tới gigabit và bạn sẽ có nó trong khoảng 1 giây. $ 50 * 2 cho các thẻ, và $ 100 cho một chuyển đổi sẽ là một nâng cấp rất rẻ bạn có thể làm.

Nhưng, giả sử nó xa hơn thế, bạn sẽ có thể mở nó bằng chế độ chỉ đọc (khi bạn đang đọc nó khi bạn sao chép nó). SMB/CIFS hỗ trợ đọc khối tệp, vì vậy bạn nên phát trực tuyến tệp tại thời điểm đó (tất nhiên, bạn không thực sự nói cách bạn truy cập tệp - tôi chỉ giả định SMB).

Đa luồng sẽ không hữu ích, vì bạn vẫn bị ràng buộc trên đĩa hoặc mạng.

1

Sử dụng nén để truyền.

Nếu phân tích cú pháp thực sự làm chậm bạn, và bạn có nhiều bộ vi xử lý, bạn có thể phá vỡ công việc phân tích cú pháp, bạn chỉ cần thực hiện theo cách thông minh - có thuật toán xác định người lao động chịu trách nhiệm xử lý với hồ sơ không đầy đủ. Giả sử bạn có thể xác định rằng một dòng là một phần của bản ghi giữa, ví dụ, bạn có thể chia tệp thành các phân đoạn N/M, mỗi phân đoạn chịu trách nhiệm về các dòng M; khi một trong các công việc xác định rằng hồ sơ của nó không được hoàn thành, nó chỉ phải đọc cho đến khi nó đạt đến cuối kỷ lục. Khi một trong các công việc xác định rằng nó đang đọc một bản ghi mà nó không có sự khởi đầu, nó sẽ bỏ qua bản ghi.

1

Tùy chọn tốt hơn, từ góc độ hiệu suất, sẽ thực hiện phân tích cú pháp của bạn tại máy chủ từ xa. Ngoài những trường hợp ngoại lệ, tốc độ mạng của bạn luôn là nút cổ chai, do đó hạn chế lượng dữ liệu bạn gửi qua mạng sẽ cải thiện đáng kể hiệu suất.

Đây là một trong những lý do khiến rất nhiều cơ sở dữ liệu sử dụng các thủ tục được lưu trữ được chạy ở cuối máy chủ.

Các cải tiến về tốc độ phân tích cú pháp (nếu có) thông qua việc sử dụng đa luồng sẽ bị làm chậm bởi tốc độ so sánh của việc chuyển mạng của bạn.

Nếu bạn cam kết chuyển tệp của mình trước khi phân tích chúng, một tùy chọn mà bạn có thể xem xét là sử dụng tính năng nén khi đang thực hiện chuyển tệp của mình. Có, ví dụ, các máy chủ sftp có sẵn sẽ thực hiện nén khi đang di chuyển. Ở cuối địa phương, bạn có thể sử dụng một cái gì đó như libcurl để làm việc phía khách hàng của việc chuyển giao, cũng hỗ trợ giải nén trực tuyến.

1

Nếu bạn có thể sao chép tệp, bạn có thể đọc tệp. Vì vậy, không cần phải sao chép nó ngay từ đầu.

EDIT: sử dụng FileStream class để kiểm soát nhiều hơn chế độ truy cập và chia sẻ.

new FileStream("logfile", FileMode.Open, FileAccess.Read, FileShare.ReadWrite) 

nên thực hiện thủ thuật.

+0

Tôi cầu xin sự khác biệt ở đó. Đó là kinh nghiệm của tôi rằng sao chép một sử dụng sẽ làm việc khi cố gắng phân tích thông qua nó trong một dòng sẽ không. Lý thuyết của tôi là bản sao sử dụng một số cửa sổ khác api cho phép nó. – midas06

+0

Lý thuyết của bạn sai, imho. Windows Explorer sử dụng cùng một API .NET (và FileStream) sử dụng. Bạn đã thử à? – VVS

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